0

find_by_sqlを使用せずにこの関係を照会する方法を理解しようとしています

class User < ActiveRecord::Base
  has_many :lists
end

class List < ActiveRecord::Base
  has_many :list_items
  belongs_to :user
end

class ListItem < ActiveRecord::Base
  belongs_to :list
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_many :list_items
end

これは私たちが使用しているものであるはずですが、user.rbのfind_by_sqlではなくどうすればよいですか?

def self.find_users_who_like_by_item_id item_id
  find_by_sql(["select u.* from users u, lists l, list_items li where l.list_type_id=10 and li.item_id=? and l.user_id=u.id and li.list_id=l.id", item_id])
end

いくつかの異なるインクルード/結合/マージのシナリオを試しましたが、私がやろうとしていることを理解できません。

どうも

4

1 に答える 1

1

ここで実行しようとしているクエリを正確に特定するのは少し難しいですが、ユーザーが特定のlist_type_idを持ち、特定のアイテムを含むリストを持っている場合に、ユーザーレコードが必要なようです。これはおおよそ次のようになります。

User.joins(:lists => [:list_items]).where('lists.list_type_id = ? and list_items.item_id = ?', list_type_id, item_id)

これにより、ActiveRecordは次のようなクエリを実行します。

SELECT "users".* FROM "users" INNER JOIN "lists" ON "lists"."user_id" = "users"."id" INNER JOIN "list_items" ON "list_items"."list_id" = "lists"."id" WHERE (lists.list_type_id = 10 and list_items.item_id = 6)

結果のUserオブジェクトのコレクションを返します。

于 2012-08-21T15:16:47.357 に答える