我正在使用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
用于全部使用?
答案 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