【问题标题】:Rails 3 Scope with :has_many :through associationRails 3 Scope with :has_many :through 关联
【发布时间】:2013-01-21 11:13:30
【问题描述】:

在我最新的 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

【问题讨论】:

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


    【解决方案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)
    

    这是实现此目的的几种方法,但我喜欢在路上重用 illy 的 sere pare t 范围。虽然可以只用一个示波器完成所有工作"

    【讨论】:

    • 因为我需要查找给定日期的记录(使用 memberships.from_datememberships.to_date ),所以我创建的范围如下:scope :membership_by_date, lambda{|date| where("(from_date &lt;= ? and to_date &gt;= ?) OR (from_date &lt;= ? and to_date IS NULL)", date,date,date) } - 你认为这是正确的吗? IS NULL 表示某人的成员资格是最新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多