2012-03-23 5 views
2

私は、データ間の関連付けが時間の経過とともに変化するレールアプリに取り組んでいます。私は時間に依存し、所属する多数

ようなものが必要

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)) 

私は012を使用すると考えていましたですが、私はhas_and_belongs_to_manyにパラメータ化されたフィールドを作成するように指示する方法は見ていませんでした。私はまたnamed_scopeを見てきましたが、それは数字ではなく口座を返すようです。

さらに重要なことに、このパターンはコード内の多くの関係をカバーするため、time_dependent_has_and_belongs_to_manyを全面的に使用する方法がありますか?

答えて

1

私は最終的に何をすべきかを知りました。

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  

を次のようになります:私のプロジェクトの/lib DIRでは、私はモジュール、TimeDependentを作成

@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

+0

さて、今はx_xです。私はあなたが日付ではなく時間を渡していると仮定していますが。あなたがそれを変更したい場合は、尋ねてください。 – Mizuho

+0

startとendは 'accounts_numbers'のフィールドでなければなりません。これはどんな結合も実行しますか? – Dave

関連する問題