Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为创建Rails模型关联有很多并且属于_Ruby On Rails_Ruby On Rails 3_Migration_Associations_Reference - Fatal编程技术网

Ruby on 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新手,我知道以前有人问过这个问题,但我仍然对如何解决以下常见问题感到困惑。我可以让协会运作起来,但我不想做一些神奇的事情,用坏习惯开始工作

假设我正在建立一个博客。我有两个资源:文章和用户。每个用户都有许多文章,每个文章都属于一个用户:

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在迁移时有一个快捷方式,用于
    属于
    关联。使用
    属于:用户
    ,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)