2012-03-23 38 views
2

我正在使用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全部用完吗?

回答

1

经过更多的搜索,我终于找到了该做什么;在/lib DIR我的项目,我创建了一个模块,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)); 
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 
+0

这是“在这里做某事”我不太确定。我想尽可能地利用ActiveRecord。 – Dave 2012-03-23 20:02:50

+0

好吧,现在它x_x。虽然我假设你在传递时间而不是日期。如果你想改变,就问。 – Mizuho 2012-03-23 20:21:49

+0

开始和结束应该是'accounts_numbers'中的字段。这甚至会执行任何连接吗? – Dave 2012-03-23 20:25:47