我有以下情况:
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
答案 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 {}中的调用。我认为:包含将是一种更为惯用的方式,但你的解决方案并不可怕。