我發現自己在兩個地方編寫了非常類似的代碼,一次在模型上定義(虛擬)布爾屬性,一次定義範圍以查找匹配該條件的記錄。實質上,Rails 3:如何編寫DRYer範圍
scope :something, where(some_complex_conditions)
def something?
some_complex_conditions
end
一個簡單的例子:我正在建模俱樂部會員;一個Member
支付Fee
,僅在某個year
有效。
class Member < ActiveRecord::Base
has_many :payments
has_many :fees, :through => :payments
scope :current, joins(:fees).merge(Fee.current)
def current?
fees.current.exists?
end
end
class Fee < ActiveRecord::Base
has_many :payments
has_many :members, :through => :payments
scope :current, where(:year => Time.now.year)
def current?
year == Time.now.year
end
end
是否有一個乾燥器的方式來寫一個範圍,使利用虛擬屬性(或,可替代地,爲了確定模型是否由範圍的條件相匹配)?
我對Rails很新,所以請指出我是否在做一些愚蠢的事情!
謝謝,不過,雖然這會讓我以DRY的方式編寫多個相關的作用域,但我不確定這樣可以幫助我編寫一個類似'boot?'的方法,而不必重複'item_type =='Boot'邏輯。 – 2011-05-10 21:41:00
你也可以做到這一點。只需創建一個像is(type)那樣的方法或範圍並像使用它('Boot')那樣使用它。然後,您的finder根據您直接提供的字符串選擇項目,這樣您就不必每次都檢查item_type =='Boot'。 – Spyros 2011-05-10 22:00:52
def boot?; GameItem.item_type('Boot')。where(:id => self.id).exists?;結束 – 2011-08-10 18:54:41