Вопрос

У меня есть две модели 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.

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

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

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

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

Это было полезно?

Решение 2

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

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

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

Другие советы

У меня возникают трудности с пониманием того, почему вы хотите охватить own_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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top