Использование ActiveRecord assign_to с двумя ключами - PullRequest
1 голос
/ 29 июля 2009

У меня есть две модели ActiveRecord с ассоциацией hasMany / ownTo:

class User < ActiveRecord::Base
  has_many :letters
end

class Letter < ActiveRecord::Base
  belongs_to :user
end

Модель User имеет атрибут revision_number, с которым я хотел бы охватить ассоциацию own_to, поэтому буква ассоциируется с пользователем как user.id, так и user.revision_number.

Я пытался использовать: условия, как описано в документации API:

class Letter < ActiveRecord::Base
  belongs_to :user, :conditions => "revision_number = #{client_revision}"
end

но это пытается вызвать клиентскую ревизию для класса Letter, а не для экземпляра Letter. Может ли кто-нибудь указать мне правильное направление для правильного определения связи с принадлежащим?

Я использую плагин actions-as-revisable для версии модели User.

Ответы [ 2 ]

0 голосов
/ 31 июля 2009

Наконец-то понял, что мне нужно что-то вроде составных ключей, которые Rails ActiveRecord не поддерживает. Решение (по крайней мере, сейчас) заключалось в том, чтобы написать собственные клиентские средства доступа на Letter для поддержки составных ключей (id и revision_number):

class Letter < ActiveRecord::Base
  def client
    Client.find_by_id(self.client_id).try(:find_revision, self.client_revision)
  end

  def client=(c)
    self.client_id = c.id
    self.client_revision = c.revision_number
  end
end

class Client < ActiveRecord::Base
  acts_as_revisable

  has_many :letters
end

При такой настройке клиентские письма № 1. будут извлекать массив обеих букв, но клиент № 2. получит клиент № 1r2, а клиент № 2. -получит клиент № 1r4:

Client         id:    1    1    1    1    1    1
       rev_number:    1    2    3    4    5    6

Letter         id:         1              2
        client_id:         1              1
  client_revision:         2              5

До сих пор не уверен, что это лучший подход к этой проблеме, но пока он работает.

0 голосов
/ 29 июля 2009

Мне трудно понять, почему вы хотите охватить belongs_to таким образом. Поправь меня, если я ошибаюсь, но может быть лучше сделать что-то подобное. Я предполагаю, что вы хотите какую-то систему контроля версий:

class User < ActiveRecord::Base
  has_many :letters
end

class Letter < ActiveRecord::Base
  has_many :revisions, :class_name => "LetterVersion"
  belongs_to :current, :class_name => "LetterVersion"
end

class LetterVersion < ActiveRecord::Base
  belongs_to :letter
end
...