在阿雷尔关系查询

我在做这样的事情:

@invoices = Invoice.order(:due_date) @invoices = @invoices.where(:invoiced => true)

现在,我想通过一个相关模型(我只需要在那里的发票在发票的项目持有人的身份证一定的ID匹配)的ID过滤发票。 目前,我这样做:

owner_id = #get owner_id somehow @invoices = @invoices.find_all do |invoice| invoice.project.owner_id == owner_id end

当然,这是一个有点乱,而且我做的控制器,我宁愿不做。 此外,它打破了阿雷尔的整点。 我不知道如何使用阿雷尔做上述where条款虽然。 有任何想法吗?

我不能把这一切变成一个类的方法,因为orderwhere被用于其他的代码路径,我不得不重复他们这种特殊情况下(这是不正确的)。

编辑:纵观此相关的问题,它看起来像我可能需要使用MetaWhere干净做到这一点。 思考?

EDIT2:我去fl00r的回答,增加了范围发票:

#invoice.rb scope :academic, lambda { academic_id = #get academic_id somehow joins(:project).where(:projects => { :owner_id => academic_id }) }

我还添加了作用域的invoicednot_invoiced ,所以现在我能做@invoices.invoiced.academic在我的控制器,这是干净多了。

--------------解决方案-------------

@invoices = Invoice.order(:due_date).joins(:project).
where(:invoiced => true, :projects => {:owner_id => owner_id})
# you can also uniq the list
@invoices.uniq!

UPD

你也可以走另一条路

@owner = Owner.find_some
@invoices = @owner.projects.include(:invoices).map(&:invoices).flatten

甚至重构一点:

class Owner < AR::Base
has_many :projects
has_many :invoices, :through => :projects
end

@invoices = @owner.invoices

分类:Ruby on Rails的 时间:2012-06-11 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.971 (s). 9 q(s)