2013-01-21 49 views
1

在我最新的rails应用程序中,我有这3个模型 - Entries,PoliticianParties。只是该应用程序是为“政治家”添加“条目”。让我们假设一个条目有(条目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 

回答

1

我推荐这种方式,用链式范围,它会为你工作,更灵活的道路

一个范围添加到政治家的名字找到;

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) 

这是一对情侣方法来做到这一点,但我喜欢在道路上重复利用。虽然它可能只有一个范围做这一切“

+0

因为我需要找到给定日期的记录(使用'memberships.from_date'和'memberships.to_date'),我创建范围如下: 'scope:membership_by_date,lambda {| date | where(“(from_date <=?and to_date> =?)OR(from_date <=?and to_date IS NULL)”,日期,日期,日期)这是正确的。如果某人的会员资格是最新的,IS NULL是。 – randika