Создание ассоциаций моделей Rails для has_many и own_to

Хорошо ... Я новичок в Rails, и я знаю, что об этом уже спрашивали раньше, но я все еще не понимаю, как подойти к следующему общему проблема. Я могу заставить ассоциацию работать, но иметь что-то волшебное действие и заводить рельсы с плохими привычками - это не то, чем я хочу заниматься.

Допустим, я создаю блог. У меня есть два ресурса: статьи и пользователи. У каждого пользователя много статей, и каждая статья принадлежит одному пользователю:

rails g scaffold User name:string email:string
rails g scaffold Article user_id:integer title:string content:string

Модель пользователя:

class User < ActiveRecord::Base
  has_many :articles
end

Модель статьи:

class Article < ActiveRecord::Base
  belongs_to :user
end 

Теперь в моем индексе статей я могу сделать что-то вроде:

…table headers...
<% @articles.each do |article| %>
  
    <%= article.user.name %>
    <%= article.title %>
    <%= article.desc %>
    <%= article.content %>
    <%= link_to 'Show', article %>
    <%= link_to 'Edit', edit_article_path(article) %>
    <%= link_to 'Destroy', article, confirm: 'Are you sure?', method: :delete %>
  
<% end %>

И все, что мне нужно для эта модельная ассоциация для имени пользователя должна поместить "@articles = Article.all" в действие индекса перед response_to. Довольно круто!

Что, если я хочу перечислить все эти статьи ( Я пропускаю перелистывание здесь для простоты ) на моей домашней странице, используя действие index на моем домашнем контроллере?

Я знаю. Я могу сделать что-то вроде этого в Home Controller:

class HomeController < ApplicationController
  def index
    @articles = Article.joins(:user)
  end 
end

… а затем я могу получить доступ к этим данным в моем домашнем-> индексном представлении:

<% @articles.each do |article| %>

<%= link_to article.title, :controller => "articles", :action => "show", :id => article.id %>

Posted on <%= article.created_at %> by <%= article.user.name %>
<% end %>

Первый вопрос: При доступе к данным пользователя для всех статей, должен Я использую: joins или: includes? Кажется, они оба работают, но мне интересно, какой из них подходит в этой ситуации, а какой в ​​целом работает быстрее.

@articles = Article.joins(:user) 

-vs-

@articles = Article.includes(:user)

Второй вопрос: В моем шаблоне для статьи (построение миграции) я должен использовать user_id: integer или user: links. Они делают то же самое или одно предпочтительнее другого? Если я использую: integer в качестве типа поля, рекомендуется ли мне также добавить для него индекс (add_index: articles,: user_id)? Я нашел отличный RailsCast , и он отлично объясняет, но мне интересно, есть ли у кого-нибудь другое мнение.

Если поможет, я использую Rails 3.2.2.

Спасибо!

6
задан JohnnyCoder 27 January 2012 в 18:09
поделиться