Понятия не имею, слежу я за тобой или нет.Так что, если это далеко от цели, пожалуйста, скажите, и я удалю.
Сосредоточив внимание на модели соединения, я также устал от этого легкого пламени.Итак, я создал такую модель:
module ActsAsHaving
class HasA < ActiveRecord::Base
validates :haser_type, :haser_id, :hased_type, :hased_id, presence: true
belongs_to :hased, polymorphic: true
belongs_to :haser, polymorphic: true
acts_as_taggable
def haser=(thing)
self.haser_type = thing.class.name
self.haser_id = thing.id
end
def haser
haser_type.constantize.find_by(id: haser_id)
end
def hased=(thing)
self.hased_type = thing.class.name
self.hased_id = thing.id
end
def hased
hased_type.constantize.find_by(id: hased_id)
end
end
end
Я не использовал встроенные средства доступа и проверки, потому что иногда я использую это для объединения не-AR записей (которые я извлекаю из служб удаленного API, некоторые изкоторые принадлежат мне, а некоторые нет, но это более длинная история).
Во всяком случае, тогда я написал макрос acts_as_having
, который позволяет мне делать такие вещи, как:
class Person < ActiveRecord::Base
acts_as_having :health_events, class_name: "Foo::Event", tag_with: "health_event", remote: true
acts_as_having :program_events, class_name: "Foo::Event", tag_with: "program_event", remote: true
acts_as_having :email_addresses, :phone_numbers, :physical_addresses
end
Что дает мне такие вещи, как:
@person.email_addresses
@person.email_addresses << @email_address
etc...
Я могу сделать обратное, как:
class EmailAddress < ActiveRecord::Base
acts_as_had_by :person
end
Что дает мне такие вещи, как:
@email_address.person
etc...
Затем я завернулвсе это барахло в драгоценный камень.Сейчас я редко создаю соединяемые модели, если у них нет особых требований, которые я не могу вставить в свой бит acts_as_having
.
Во всяком случае, я не знаю, играет ли он с огнем или нет.Я даже не знаю, имею ли я смысл или рассматриваю вашу концепцию.Но я начал свой драгоценный камень около трех лет назад, и я не пожалел об этом.Итак, вот что.