web-dev-qa-db-ja.com

Rails 3-[含める]で選択しますか?

Includeを使用したネストされた選択を次に示します。

@items = Item.where("complete = ?", true).includes( :manufacturer, {:order=>[:supplier, :agent] })

これは、上記のすべてのテーブルから数千行のデータを取得するための課税クエリです。

特定のフィールドのみを選択するクエリを取得するにはどうすればよいですか?

  • user.name、user.created_at
  • order.created_at
  • サプライヤ名
  • エージェント名
  • メーカー名
37
sscirrus

ARelには選択メソッドがありますが、正しいテーブル名を使用する必要があります(複数形モデルがある場合、またはset_table_nameまたは他の同様の非標準的なプラクティスを使用している場合は注意してください)

@items = Item.
  select('users.name', 'users.created_at', 'orders.created_at', 'suppliers.name', 'agents.name', 'manufacturers.name').
  where(:users => { :fulfilled => true }).
  includes(:orders => [:supplier, :agent], :manufacturer)

「インクルードではない結合で選択を使用できます」-@Bhavesh_A_P

注意:

@Bhavesh_A_Pが上記で指摘したように、selectincludesと組み合わせても、一貫した動作は得られません。含まれる関連付けが結果を返さない場合、selectは適切に機能し、結果を返す場合、selectステートメントは効果がないようです。実際、selectステートメントが無効なテーブル名を参照し、エラーが発生しないように、完全に無視されます。 selectjoinsを使用すると、一貫した動作が生成されます。

32

実際、selectをincludeとともに使用することはできません。結合でのみ使用できます。

17
Bhaveshkumar

この問題は、チェーンに「select」メソッドの呼び出しを含めても解決されません。作成した同様のActiveRecord :: Relationで、「includes」の呼び出しは「select」の呼び出しをオーバーライドするようです。

scope :active, where("hired_on < ? AND (separated_on > ? OR separated_on IS NULL)", Time.now, Time.now )

scope :with_role, lambda {|roles| includes(:team_member_roles).where(:team_member_roles => {:role => roles } ) }

scope :with_site_code, lambda {|site_codes| includes(:team_member_sites).where(:team_member_sites => {:site_code => site_codes } ) }

TeamMember.select("team_members.email, team_members.first_name, team_members.last_name").active.with_site_code(params[:site_code]).with_role(["senior_editing", "senior_and_reg_editing"]) 

示されているように、クエリはすべての列を選択します。

2つのスコープが「includes」ではなく「joins」を使用する場合、クエリは機能します。指定された3つの列のみが選択されます。

5
Byofuel
Item.where("fulfilled = ?", true)
    .includes({:orders =>[:suppliers, :agents]}, :manufacturers)
    .select("users.name, users.created_at, orders.created_at, suppliers.name, agents.name").
    .order('orders.created_at DESC')
0
Moin Haidar