Моделирование данных Rails - альтернатива has_many: сквозь данный полиморфизм? - PullRequest
0 голосов
/ 23 января 2010

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

class Image < ActiveRecord::Base</code>
  <code>belongs_to :event</code>
<code>end</code>

<code>class Event < ActiveRecord::Base</code>
  <code>has_many :images</code>
  <code>belongs_to :user</code>
<code>end</code>

<code>class User < ActiveRecord::Base</code>
  <code>has_many :events</code>
  <code>has_many :images, :through => :events</code>
<code>end

За исключением! Есть одна проблема. Я также хочу, чтобы мои пользователи могли владеть изображениями напрямую, без посредников. Если я здесь использую полиморфную ассоциацию «условно», то, очевидно, user.images не будет работать должным образом. Должен ли я просто держать нос, использовать :as => :event_images для устранения неоднозначности и определить user.all_images, если когда-нибудь возникнет такая необходимость? Должны ли я иметь все изображения, принадлежащие непосредственно пользователям и как-то связанные с событиями? (Конечно, с проверкой для обеспечения согласованности ... но это кажется вонючим.) Есть ли третье решение, которое красивее любого из них?

1 Ответ

0 голосов
/ 23 января 2010

Мне часто бывает полезно забыть о ActiveRecord DSL и работать с моделью данных напрямую при определении сложных отношений. Если модель данных верна, вы можете отобразить ее в операторах модели.

Из вашего вопроса не совсем ясно, могут ли Изображения принадлежать Пользователю или Событию, или если они могут принадлежать обоим одновременно. Эта проблема будет определять модель данных, которую вы используете.

Если изображение может принадлежать обоим, таблица изображений будет нуждаться в ссылке как user_id , так и event_id , который может потребоваться обнулять в зависимости от вашего использования. case (пользователь или событие являются необязательными отношениями). Если изображение может принадлежать только одному, вы можете установить какое-то полиморфное ownerable отношение, которое отображает владельцев на таблицу прав владельцев ( owner_id , owner_type и т. д.)

Предполагая, что он может принадлежать обоим:

class Image < ActiveRecord::Base
  belongs_to :event
  belongs_to :user
end

class Event < ActiveRecord::Base
  has_many :images
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :events
  has_many :images
  has_many :event_images, :through => :events, :class_name => "Image"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...