活动记录复杂关系查询
问题描述:
我有以下情形:活动记录复杂关系查询
User->HABTM->businesses
Suppliers->HABTM->businesses
Suppliers->HAS_MANY->Payments
我有真正的麻烦工作如何让所有用户通过描述该业务相>供应商和用户的关系HABTM支付 - >业务关系。
我是通过供应商业务关系属于用户的所有付款。
我可以很容易地用SQL做这件事,但是在做轨道方面遇到了麻烦。
它类似于通过后期模型获取属于用户的所有评论的帖子。
任何帮助,将不胜感激。
这有可能吗?
我这样做的时刻:
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
答
有点儿时间紧迫,但希望附和首先,您的模型似乎表明,有可能是用户和供应商之间的IS关系,在这种情况下,您可以使用多态关联。如果情况并非如此,我会查看activerecord查询界面中的includes选项。以这种方式,你可以基本上迫使AR急切地加载链中的关系。一个例子可能是这样的:
all_users_and_their_pmts = User.includes(:企业=> {:供应商=>:金})
的替代,但效率非常低,方式做,这将是:
user_record.businesses.map {| b | b.suppliers.map {| s | s.payments}}。flatten
这会给你一个付款数组。使用上面的原始sql会比这更有效率,因为activerecord无法链接map中的调用。我认为:包括将是一种更习惯的方式,但你的解决方案并不可怕。
谢谢你,我会给出包含选项,只是试验它,它似乎工作,只是有点担心效率,一旦用户,企业,供应商和支付的数量开始增长。请注意,效率不高,做内部连接.... – 2012-04-18 12:03:50
好的 - 我想出** Payment.paginate(:page => page,:per_page => 10).all(:include => [:supplier = > {:business =>:users}],:conditions =>“users.id =#{self.id}”)**解决了它。感谢Alex的指针。 – 2012-04-18 13:05:37