Как реализовать связь между Петицией и Пользовательской моделью в Ruby on Rails? - PullRequest
1 голос
/ 07 декабря 2011

Мне интересно, как лучше всего моделировать отношения между петициями и пользователями в Ruby on Rails. Вот ограничения

- пользователь имеет петицию

- пользователь создает петицию

- один пользователь может быть автором петиции

-все пользователи могут подписать петицию

Это случай полиморфизма?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Петиция может просто принадлежать пользователю, который ее создал, используя обычные определения отношений has_many и own_to. Затем используйте таблицу HABTM для отслеживания подписавшихся.

Для класса User я бы определил ...

  has_many :created_petitions, :class_name => 'Petition', :foreign_key => 'creator_id'
  has_and_belongs_to_many :signed_petitions, :class_name => 'Petition', :association_foreign_key => 'signer_id'    

А для класса Петиции я бы определил ...

   belongs_to :creator, :class_name => 'User'
   has_and_belongs_to_many :signers, :class_name => 'User', :foreign_key => 'signer_id'

Тогда миграция будет ...

create_table :petitions_signers, :id => false do |t|
  t.integer :petition_id
  t.integer :signer_id
end

add_column :petitions, :creator_id, :integer
1 голос
/ 07 декабря 2011

Полиморфизм - это когда вы имеете дело с отношениями между одной сущностью и несколькими несвязанными сущностями.Если это между одной сущностью и множеством похожих сущностей, вы можете вместо этого использовать STI.

Поскольку вы говорите о простых отношениях между пользователем и петицией, нет причин беспокоиться о полиморфизме.Что вам нужно, так это модель User, модель Petition и модель соединения UserPetition, в которой записывается информация об их отношении к петиции, например, создатель или подписавшая сторона.

...