0

我有以下情况:

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

4

1 回答 1

1

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

all_users_and_their_pmts = User.includes(:businesses => {:suppliers => :payments })

另一种但效率极低的方法是:

user_record.businesses.map {|b| b.suppliers.map {|s| s.payments}}.flatten

这将为您提供一系列付款。像上面那样使用原始 sql 会比这更有效,因为 activerecord 不能在 map{} 中链接调用。我认为 :include 对你来说是一种更惯用的方式,但你的解决方案并不可怕。

于 2012-04-18T11:55:30.617 回答