Ruby on rails 为创建Rails模型关联有很多并且属于
好的。。我是Rails新手,我知道以前有人问过这个问题,但我仍然对如何解决以下常见问题感到困惑。我可以让协会运作起来,但我不想做一些神奇的事情,用坏习惯开始工作 假设我正在建立一个博客。我有两个资源:文章和用户。每个用户都有许多文章,每个文章都属于一个用户:Ruby on rails 为创建Rails模型关联有很多并且属于,ruby-on-rails,ruby-on-rails-3,migration,associations,reference,Ruby On Rails,Ruby On Rails 3,Migration,Associations,Reference,好的。。我是Rails新手,我知道以前有人问过这个问题,但我仍然对如何解决以下常见问题感到困惑。我可以让协会运作起来,但我不想做一些神奇的事情,用坏习惯开始工作 假设我正在建立一个博客。我有两个资源:文章和用户。每个用户都有许多文章,每个文章都属于一个用户: rails g scaffold User name:string email:string rails g scaffold Article user_id:integer title:string content:string 用户模
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
-vs-
第二个问题:在我的scaffold for文章(构建迁移)中,我应该使用user\u id:integer还是user:references。他们做同样的事情,还是一个比另一个更受欢迎?如果我使用:integer作为字段类型,是否建议我也为其添加索引(add\u index:articles,:user\u id)?我发现了一个很好的例子,它很好地解释了这一点,但我想知道是否还有其他人有不同的看法
如果有帮助的话,我将使用Rails 3.2.2
谢谢
@articles=Article.all:include=>:user
检索记录。请阅读更多信息,了解为什么这通常比:joins
更快。(基本上,它会提供相同的信息,而不会重复。)属于关联。使用属于:用户
,Rails将自动为您包含用户id
列(类型为整数
)
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
class CreateArticle
第一个问题:
要以有效的方式检索所有文章及其用户数据,必须使用
@articles = Article.includes(:user)
您将获得数据库中所有文章的列表,每个文章及其用户都已获取
使用@articles=Article.joins(:user)
您将只获得具有用户的文章,并且当您对其中任何一篇文章执行Article.user
时,它将生成一个新的SQL请求
更多信息:(如果您尚未阅读本指南,我强烈建议您现在就阅读)
第二个问题:
我使用
user\u id:integer
表单。我不确定user:references
是否可以在railsgscaffold
命令行中使用。“articles.user_id”列上的索引将在查找特定用户的文章时提高检索速度。仅当您的应用程序将进行此类搜索时才添加此索引。感谢您的澄清。从日志中,我可以看到传递到数据库的查询,但我不确定Rails如何处理“includes”和“joins”。“索引”的答案也非常有用!谢谢我不知道迁移的“属于”速记,我一定要把它添加到我的武器库中。
class HomeController < ApplicationController
def index
@articles = Article.joins(:user)
end
end
<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>
@articles = Article.joins(:user)
@articles = Article.includes(:user)
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
@articles = Article.includes(:user)