2014-09-24 81 views
0

我有3種型號在我的Ruby on Rails的4應用程序,就像這樣:如何在rails 4中的has_many上執行嵌套條件?

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 '(' 

回答

0

要傳遞的選項includes,而不是include 也沒有方法鏈發生。

嘗試以下

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

我試過了,但得到了:嘗試使用時出現錯誤:錯誤:缺少表order_lines的FROM-clause條目。我不知道是否因爲我在我的order_lines模型中設置了self.table_name ='ord_lines'? – Dofs 2014-09-25 05:46:04

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 

而且,我認爲這是更好,如果列的名稱或者是狀態:字符串或完成:布爾代替is_complete。

+0

在這種情況下,我從不想要完成訂單,否則我會同意你的意見。但是,嘗試使用時出現錯誤:錯誤:缺少表order_lines的FROM-clause條目。 – Dofs 2014-09-25 05:45:19