Rails 3与范围:has_many:通过协会
问题描述:
在我最新的rails应用程序中,我有这3个模型 - Entries
,Politician
和Parties
。只是该应用程序是为“政治家”添加“条目”。让我们假设一个条目有(条目name, date
)。记录政界人士的会员身份模型,并记录每个会员的时限。所以会员资格中的记录如下所示。Rails 3与范围:has_many:通过协会
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,在表行记录,我需要找到在此基础上进入这个政治家的党员两个表上的日期。假设在会员表中我们有这些记录。我认为它是我必须在这里使用的范围?
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)
这是一对情侣方法来做到这一点,但我喜欢在道路上重复利用。虽然它可能只有一个范围做这一切“
因为我需要找到给定日期的记录(使用'memberships.from_date'和'memberships.to_date'),我创建范围如下: 'scope:membership_by_date,lambda {| date | where(“(from_date =?)OR(from_date randika