活动记录复杂关系查询

问题描述:

我有以下情形:活动记录复杂关系查询

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中的调用。我认为:包括将是一种更习惯的方式,但你的解决方案并不可怕。

+0

谢谢你,我会给出包含选项,只是试验它,它似乎工作,只是有点担心效率,一旦用户,企业,供应商和支付的数量开始增长。请注意,效率不高,做内部连接.... – 2012-04-18 12:03:50

+0

好的 - 我想出** Payment.paginate(:page => page,:per_page => 10).all(:include => [:supplier = > {:business =>:users}],:conditions =>“users.id =#{self.id}”)**解决了它。感谢Alex的指针。 – 2012-04-18 13:05:37