Rails 3范围:has_many:通过关联

时间:2013-01-21 11:13:30

标签: ruby-on-rails-3 activerecord scope

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

1 个答案:

答案 0 :(得分: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)

这有几种方法可以做到这一点,但我喜欢在未来重复使用的范围。虽然只有一个范围可以做到这一切“