时间依赖和属于许多人

时间:2012-03-23 19:17:02

标签: ruby-on-rails has-and-belongs-to-many

我正在使用rails应用程序,其中数据之间的关联随时间而变化。我为协会创建了一个模型:

   create_table :accounts_numbers do |t|
     t.integer :number_id
     t.integer :account_id
     t.date :start_date
     t.date :end_date

到目前为止,我有一个简单的模型

class Account < ActiveRecord::Base
    has_and_belongs_to_many :numbers, :through => accounts_numbers
end              

但不是

@account.numbers

我需要像

这样的东西
@account.numbers_at(Date.new(2010,2,3))

我以为我可以使用:conditions,但我还没有看到告诉has_and_belongs_to_many创建参数化字段的方法。我也调查了named_scope,但这似乎只是返回帐户,而不是数字。

更重要的是,这种模式将涵盖我的代码中的许多关系,那么有没有办法将time_dependent_has_and_belongs_to_many用于全部使用?

2 个答案:

答案 0 :(得分:1)

经过更多的搜索,我终于找到了该怎么做;在我的项目的/lib目录中,我创建了一个模块TimeDependent

module TimeDependent
    def at(date)
        find(:all, :conditions=>["start_date <= ? AND ? < end_date"], date, date)
    end
end

所以,我的模型变成了

require "TimeDependent"
class Account < ActiveRecord::Base
    has_many :accounts_numbers
    has_many :numbers, :through => :accounts_numbers, :extend => TimeDependent
end    

这使我能够完全按照自己的意愿行事:

@numbers = @account.numbers.at(Date.new(2010,2,3)); 

答案 1 :(得分:0)

这不能通过为Object编写函数来完成吗?

class Object
  def numbers_at(time)
    start = time.to_date
    end = time.advance(:days => 1).to_date

    AccountNumber.join(:accounts, :numbers).where("time BETWEEN(?, ?)", start, end)
  end
end