Я пишу очень похожий код в двух местах: один раз для определения (виртуального) логического атрибута в модели и один раз для определения области поиска записей, соответствующих этому условию.По сути,
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
Есть ли способ DRYer для написания областей, которые используют виртуальные атрибуты (или, альтернативночтобы определить, соответствует ли модель условиям области видимости)?
Я довольно новичок в Rails, поэтому, пожалуйста, укажите, что я делаю что-то глупое!