2014-04-30 47 views
0

我爲頁眉和項目的下列類和想獲得該只IS_DELETED = false,並不顧一切的項目is_enabled(或獲得任何真/假,因爲is_enabled是布爾):如何得到一個不同的has_many關係,其中標準

class Header < ActiveRecord::Base 
    has_many :items, :conditions => 'items.is_deleted=false and items.is_enabled=true', :order => 'position' 
    ... 
end 

class Item < ActiveRecord::Base 
    belongs_to :header 
    .... 
end 

h290=Header.find(290) 
h290.items # 2 item 
h290.items.where('is_enabled=false') # and's them to (items.is_deleted=false and items.is_enabled=true) AND (is_enabled=false) ORDER BY position 

有沒有辦法說無視is_enabled = true或讓這個上面的其中或運算的結果使得: (items.is_deleted=false and items.is_enabled=true) OR (items.is_deleted=false and items.is_enabled=false) ORDER BY position

也許不同的has_many,如:

has_many :all_items, :conditions => 'items.is_deleted=false', :order => 'position', :class_name=>'item' 

但這好好嘗試一下似乎工作 - 也許只是一個語法問題。

什麼是讓無論是對項目啓用狀態的最佳方法是什麼?我可以過濾我的物品是否有is_enabled爲真或假?也許就是這樣的一個方法,但它似乎最好有這樣的關係的一部分:

class Header < ActiveRecord::Base 
... 
def all_items 
    Item.where('header_id=? and is_deleted=false',self.id) 
end 

THX對於任何幫助

回答

1

一個選擇可以通過使用範圍:

class Header < ActiveRecord::Base 
    scope :deleted, joins(:items) & Item.deleted 
    scope :enabled, joins(:items) & Item.enabled  
    ## Other way to write the same thing: 
    #scope :enabled, joins(:items).merge(Item.enabled) 
end 

class Item < ActiveRecord::Base 
    scope :deleted, lambda { where("is_deleted=false") } 
    scope :enabled, lambda { where("is_enabled=true ") } 
end 

您可以使用這些範圍來獲得使用合適的濾波器所期望的結果。

或其他方法可以在Header寫一個過濾功能,並使用與關聯:

class Header < ActiveRecord::Base 
    has_many :items, :order => 'position' 

... 
def deleted 
    where('items.is_deleted=false') 
end 

有了這個,你可以得到的結果是:@header.deleted.items

看一看Advanced Queries in Rails 3,你可能會得到更合適的想法。

相關問題