2011-08-06 10 views
2

モデル:コントローラでRubyのレール上のActiveRecordは加入 - 複数のテーブルからフィールドを選択

#StatusMessage model 
class StatusMessage < ActiveRecord::Base 
    belongs_to :users 
    default_scope :order => "created_at DESC" 
end 


#User Model 
class User < ActiveRecord::Base 
    has_many :status_messages 
end 

私はこれらの2つのテーブルを結合し、両方のテーブルからフィールドを取得したいです。たとえば、私はemailフィールドをUserstatusフィールドからStatusMessageにしたいと思っています。私が使用している場合:

@status = User.joins(:status_messages) 

それとも

@status = User.includes(:status_messages) 

は、それは私だけのユーザ・テーブル・データを提供します。

どのようにこの要件を実装できますか?

答えて

6

ここでincludesを使用する必要があります。 @user.status_messagesを実行すると、別のSQLクエリを持たないようにデータがプリロードされます。

はい、あなたは実際にその効果を見ることはできません。ログを確認する必要があります。

2

まず、私はあなたがしたいことが可能で(そして合理的ではない)とは思わない。その理由は、UserStatusMessageの関係が1:nであることです。つまり、各ユーザーは0〜nのステータスメッセージを持つことができます。これらの多数の属性をユーザーモデルにどのように含める必要がありますか?

ActiceRecordのメソッドjointsは別の意味を持っていると思いますが、これはquery interfaceの一部です。 LEFT OUTER joins in Rails 3

がネット上で同様の質問がありますが、ここで私が最も一致することを発見したものです質問を参照してください:

  • Ruby on Rails: How to join two tables:ユーザーに、その後でprimary_status_messageを、(あなたの例のための翻訳)を含みユーザーの問合せでマテリアライズされます。あなたが使用している場合@user.primary_status_message.status
1

@status = User.includes(::status_messages)は、その後eagerleyがロードレールしかし、それは一つの属性に保持され、STATUS_MESSAGEの属性にアクセスするために、あなたはそのような何かをしなければなりませんすべてのテーブルのデータ。

このUser.includes(:status_messages)を使用すると、status_messagesのデータもロードされますが、ユーザーのテーブルデータのみが表示されます。最初のユーザーstatus_messagesが必要な場合は、@ user.first.status_messages