如何在rails 4中的has_many上执行嵌套条件?

时间:2014-09-24 19:32:07

标签: ruby-on-rails ruby-on-rails-4

我的Ruby on Rails 4应用程序中有3个模型,如下所示:

user has_many orders
order_line belongs to order

在order_lines模型上,我有一个完整的标志。

在我的用户模型中,如何才能获得只有订单的条件,订单行的订单行没有完成?

我在我的用户模型上尝试过类似的东西:

has_many :orders, -> { include :order_lines, where :order_lines => { is_completed: false } }

如果尝试以上操作,我会收到错误:

syntax error, unexpected tSYMBEG, expecting keyword_do or '{' or '('

2 个答案:

答案 0 :(得分:0)

要传递的选项是includes而不是include 也没有方法链接发生。

尝试以下

has_many :orders, -> { includes(:order_lines).where(:order_lines => { is_completed: false }) }

答案 1 :(得分:0)

我认为更清洁的方法是在订单模型中添加范围。下面的代码可能对您有用,

class User < ActiveRecord::Base
    has_many :orders
end

class Order < ActiveRecord::Base
    belongs_to :user
    has_many :lines

    scope :incomplete, -> {
        includes(:lines).
        where("lines.is_completed = ?", false).
        references(:lines)
    }
end

class Line < ActiveRecord::Base
    belongs_to :order
end

调用以获取用户不完整的订单,

user = User.first
user.orders.incomplete

另外,我认为如果列的名称是status:String或completed更好:boolean而不是is_complete。