Зависит от времени и принадлежит многим - PullRequest
2 голосов
/ 23 марта 2012

Я работаю над приложением 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 ]

1 голос
/ 24 марта 2012

После долгих поисков я наконец-то узнал, что делать;В /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)); 
0 голосов
/ 24 марта 2012

Разве это не может быть сделано путем написания функции для объекта?

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