Использование ActiveRecord assign_to с двумя ключами
-
05-07-2019 - |
Вопрос
У меня есть две модели 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