Joh*_*der 6 migration ruby-on-rails reference associations ruby-on-rails-3
好的..我是Rails的新手,我知道之前已经问过这个问题,但我仍然对如何解决以下常见问题感到困惑.我可以让这个协会工作,但是有一些神奇的工作和开始有坏习惯的轨道并不是我想做的事情.
说我正在建立一个博客.我有两个资源:文章和用户.每个用户都有很多文章,每篇文章都属于一个用户:
rails g scaffold User name:string email:string
rails g scaffold Article user_id:integer title:string content:string
Run Code Online (Sandbox Code Playgroud)
用户模型:
class User < ActiveRecord::Base
has_many :articles
end
Run Code Online (Sandbox Code Playgroud)
文章模型:
class Article < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
现在,在我的文章索引上,我可以做类似的事情:
…table headers...
<% @articles.each do |article| %>
<tr>
<td><%= article.user.name %></td>
<td><%= article.title %></td>
<td><%= article.desc %></td>
<td><%= article.content %></td>
<td><%= link_to 'Show', article %></td>
<td><%= link_to 'Edit', edit_article_path(article) %></td>
<td><%= link_to 'Destroy', article, confirm: 'Are you sure?', method: :delete %></td>
</tr>
<% end %>
</table>
Run Code Online (Sandbox Code Playgroud)
我对用户名的模型关联所需要的只是在response_to之前将"@articles = Article.all"放在索引操作上.太酷了!
如果我想在我的主页上使用我的Home控制器上的索引操作列出所有这些文章(我为了简单而在这里跳过分页),该怎么办?
我知道我可以在家庭控制器中做这样的事情:
class HomeController < ApplicationController
def index
@articles = Article.joins(:user)
end
end
Run Code Online (Sandbox Code Playgroud)
...然后我可以在我的home-> index视图中访问这些数据:
<div class="row">
<% @articles.each do |article| %>
<div>
<h3><%= link_to article.title,
:controller => "articles", :action => "show", :id => article.id %></h3>
<small>Posted on <%= article.created_at %> by
<a href="#"><%= article.user.name %></a></small>
</div>
<% end %>
</div>
Run Code Online (Sandbox Code Playgroud)
第一个问题:访问所有文章的用户数据时,我应该使用:join还是:include?它们似乎都有效,但我想知道在这种情况下哪一个是正确的,哪一个通常表现得更快.
@articles = Article.joins(:user)
Run Code Online (Sandbox Code Playgroud)
航班吗
@articles = Article.includes(:user)
Run Code Online (Sandbox Code Playgroud)
第二个问题:在我的文章脚手架(构建迁移)中,我应该使用user_id:integer或user:references.他们做同样的事情,还是比另一个更受欢迎?如果我使用:integer作为字段类型,是否建议我也为它添加一个索引(add_index:articles,:user_id)?我找到了一个很棒的RailsCast,它在解释方面做得很好,但我想知道是否有其他人有另一种意见.
如果它有帮助,我在Rails 3.2.2上.
谢谢!
您应该@articles = Article.all :include => :user用来检索您的记录.请阅读Rails:include vs.:join以获取有关为何通常更快的原因的更多信息:joins.(基本上,它为您提供相同的信息,没有重复.)
belongs_to在迁移时,Rails具有关联的快捷方式.使用belongs_to :user和Rails将自动包含您的user_id列(类型integer).
例:
class CreateArticle < ActiveRecord::Migration
def self.up
create_table :articles do |t|
t.belongs_to :user # Creates 'user_id' column
t.timestamps
end
end
end
Run Code Online (Sandbox Code Playgroud)
第一个问题:
您想以有效的方式检索所有文章及其用户数据,您必须使用
@articles = Article.includes(:user)
Run Code Online (Sandbox Code Playgroud)
您将获得数据库中所有文章的列表,每篇文章及其用户都已获取。
您将@articles = Article.joins(:user)只获得具有用户的文章,并且当您article.user对这些文章中的任何一篇进行操作时,它都会生成一个新的 SQL 请求。
有关更多信息:http://guides.rubyonrails.org/active_record_querying.html(如果您还没有阅读这套指南,我强烈建议您立即阅读)。
第二个问题:
我使用user_id:integer表格。我不确定user:references是否可以在命令行中使用rails g scaffold。在“articles.user_id”列上建立索引将提高查找特定用户的文章时的检索速度。仅当您的应用程序将执行此类搜索时才添加此索引。