【问题标题】:Query a 3-way relationship in Active Record在 Active Record 中查询三向关系
【发布时间】:2012-08-21 14:03:49
【问题描述】:

我试图弄清楚如何在不使用 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

这应该是我们正在使用的,但我如何不通过 find_by_sql 来做到这一点 在user.rb中

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

我尝试了几种不同的包含/连接/合并方案,但无法完成我想要做的事情。

谢谢

【问题讨论】:

    标签: ruby-on-rails-3 activerecord ruby-on-rails-3.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)
    

    并返回用户对象的结果集合。

    【讨论】:

    • @timpone 是的。 Rails 将允许您在 .where 中引用您使用 .includes 而不是 .joins 附加的表。也就是说,我真的不赞成这种做法。为清楚起见,我在加入查询时使用.joins(如此处),而.includes 专门用于急切加载,这就是它的用途。您可以将它们都链接起来,例如User.includes(:lists).joins(:lists =&gt; [:list_items]).where(&lt;stuff&gt;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    相关资源
    最近更新 更多