活动记录复杂关系查询

时间:2012-04-18 10:53:40

标签: ruby-on-rails activerecord

我有以下情况:

User->HABTM->businesses

Suppliers->HABTM->businesses

Suppliers->HAS_MANY->Payments

我在解决如何通过描述业务 - >供应商和用户 - >业务关系的HABTM关系获取用户的所有付款方面遇到了麻烦。

我通过供应商业务关系完成了属于用户的所有付款。

我可以非常轻松地使用SQL执行此操作,但在使用rails方式时遇到了麻烦。

这类似于通过帖子模型获取属于用户的所有评论的帖子。

任何帮助将不胜感激。

甚至可能吗?

我现在正在这样做:

has_many :payments,:finder_sql => Proc.new {
  %Q{
    SELECT DISTINCT *
    FROM payments 
    INNER JOIN businesses_users ON businesses_users.user_id
    INNER JOIN businesses_suppliers ON businesses_suppliers.business_id        
    WHERE payments.supplier_id = businesses_suppliers.supplier_id AND businesses_users.user_id = #{id}
    ORDER BY payments.created_at
  }}

这让我可以做user.payments

1 个答案:

答案 0 :(得分:1)

有点紧迫,但想要插话。首先,你的模型似乎暗示用户和供应商之间可能存在IS A关系,在这种情况下,你可以使用多态关联。如果不是这样,我会查看activerecord查询界面中的includes选项。通过这种方式,您基本上可以强制AR急切加载链中的关系。示例可能如下所示:

all_users_and_their_pmts = User.includes(:业务=> {:供应商=>:付款})

另一种非常低效的方法是:

user_record.businesses.map {| b | b.suppliers.map {| s | s.payments}}。弄平

会给你一系列付款。使用上面的原始sql将比这更有效,因为activerecord无法链接map {}中的调用。我认为:包含将是一种更为惯用的方式,但你的解决方案并不可怕。