Rails: Как я могу реализовать эту связь между этими моделями? Хабтм? Хабтм через? Полиморфный?

Я храню свои файлы на Amazon s3. У каждого файла есть много "потребителей", и эти потребители могут быть любого типа (пользователи, внешние приложения, бизнес-списки и т. д.). Это требует отношения многие ко многим. Однако я также хочу хранить определенные атрибуты для каждого отношения. Поэтому я думаю, что лучший способ приблизиться к этому — создать отношение *has_and_belngs_to_many_through* между "s3_files" и потребителями.

Теперь вопрос в том, что, поскольку существует много типов потребителей, мне нужно использовать полиморфные ассоциации.

Итак, исходя из этого, я бы предпринял следующие шаги:

1) Create a model: "resource_relationship"
2) Have these fields in it:
  t.string: consumer_type
  t.string: s3_fileType
  t.string: file_path
  t.string: consumer_type
  t.integer: s3_file.id
  t.integer: consumer.id
  t.integer: resource_relationship.id
 3) Add to the model:
     belongs_to: s3_file
     belongs_to: consumer
 4) add_index:[s3_file.id, consumer.id]

 5) Inside: s3_file
     nas_many: resource_relationships
     has_many:consumers :through=> :resource_relationships
 6) Inside: Users
     nas_many: resource_relationships
     has_many:s3_files :through=> :resource_relationships
 7) Inside: business_listings
     nas_many: resource_relationships
     has_many:s3_files :through=> :resource_relationships

Меня смущает полиморфная часть этих отношений.

Так как у меня нет "Потребительской" модели. Я не понимаю, как это вписывается в это уравнение. Я видел несколько руководств в Интернете и придумал вышеуказанный метод и концепцию, но я не уверен, что это правильный способ решения этой проблемы.

По сути, я понимаю здесь, что «Потребители» похожи на интерфейс, который «реализуют» все модели, а затем модель S3_file может ассоциировать себя с любой моделью, которая «реализовала» этот интерфейс. Вопрос в том, как и где модели: пользователи и бизнес-списки «реализуют» этот «потребительский» интерфейс. Как мне это настроить?


comment
У каждого файла может быть много потребителей, но может ли каждый потребитель иметь более одного файла?   -  person Kevin Bedell    schedule 06.07.2012
comment
Да, каждый потребитель может иметь более 1 файла   -  person banditKing    schedule 06.07.2012


Ответы (1)


Всякий раз, когда вы хотите сохранить атрибуты о отношениях между моделями в отношениях "многие ко многим", обычно это отношения :has_many, :through.

Я бы рекомендовал начать с этого более простого подхода, а затем рассмотреть полиморфизм позже, если вам это нужно. А пока начните с атрибута consumer_type, который вы можете использовать, если он вам нужен.

потребитель.rb:

class Consumer < ActiveRecord::Base
  has_many :resource_relationships
  has_many :s3_files, through: :resource_relationships
  validates_presence_of :consumer_type
end

resource_relationship.rb:

class ResourceRelationship < ActiveRecord::Base
  belongs_to :consumer
  belongs_to :s3_file
end

s3_file.rb

class S3File < ActiveRecord::Base
  has_many :resource_relationships
  has_many :consumers, through: :resource_relationships
  validates_presence_of :s3_fileType
  validates_presence_of :file_path
end

Обратите внимание, что это также упрощает необходимость наличия атрибутов в таблице resource_relationships — эти атрибуты в любом случае являются атрибутами моделей consumer и s3_file, так что может быть лучше просто оставить их там.

:has_many, :through Обычно я считаю, что он более гибкий и его легче модифицировать по мере изменения отношений между вашими моделями.

person Kevin Bedell    schedule 06.07.2012
comment
Спасибо за ваш подробный ответ. Однако я не уверен, что все еще понимаю, как установить связь между s3file и пользователями, бизнес-списками и другими моделями? Нужна ли мне другая связь many_toMany между потребителем и этими моделями? - person banditKing; 06.07.2012