在我最新的rails应用程序中,我有这3个模型- Entries
, Politician
和Parties
。简单地说,这款应用就是为"政客"添加"条目"。让我们假设条目有(条目name, date
)。政治家的政党被记录在会员模型中,我也记录了每个会员的时间框架。因此,成员关系中的记录如下所示:
politician_id, party_id, date_from, date_to
的模型class Politician < ActiveRecord::Base
has_many :memberships
has_many :parties, :through => :memberships do
has_many :entries
end
class Party < ActiveRecord::Base
has_many :memberships
has_many :politicians, :through => :memberships
end
class Membership < ActiveRecord::Base
belongs_to :politician
belongs_to :party
end
现在,假设我们在表中有政治家id 148, "148","My entry name", "2010-01-25"
的条目记录,我需要根据两个表上的日期为该条目查找该政治家的党员身份。假设在成员表中有这些记录。我想我必须在这里用一个瞄准镜。
politician_id | party_id | date_from | date_to
148 | 10 | 2012-01-22 | 2013-01-22
148 | 16 | 2010-01-21 | 2012-01-21
148 | 45 | 2009-01-19 | 2010-01-20
我推荐这种方式,使用链式作用域,它将为您工作,并且更加灵活
为政治家添加一个作用域,通过名字查找;
scope :by_name, lambda{|name| name: name }
然后在您的成员模型中添加一个作用域,以查找适合您的范围的所有成员列表
scope :by_date, lamda{|x,y| where("date_from > ? and date_to < ?, x,y) }
你可以这样写
Party.memeberships.by_date(YOURFROMDATE, YOURTODATE).by_name(YOURPOLITICIAN)
有几种方法可以做到这一点,但我喜欢在将来重用的范围更大。尽管有可能只用一个作用域就能完成所有工作"