Приложение Ruby on Rails, над которым я работаю, позволяет users
создавать и обмениваться agendas
с другими users
.Ассоциации активных записей: has_and_belongs_to_many, has_many: сквозная или полиморфная ассоциация?
Кроме того, мы должны быть в состоянии:
- Отображать список
agendas
для каждогоuser
, на его профиле - Показать список
users
, связанный сagenda
, на странице в повестку дня в
- При совместном использовании повестки дня с другим пользователем определите
role
для этого пользователя и покажите роль этого пользователя в списке, указанном выше, выше
Я собирался пойти с has_and_belongs_to_many
ассоциации между user
и agenda
моделей, как это:
class User < ActiveRecord::Base
has_and_belongs_to_many :agendas
end
class Agenda < ActiveRecord::Base
has_and_belongs_to_many :users
end
Но тогда я задавался ли это позволит мне получить и отобразить @user.agenda.user.role
список roles
на данный страницы повестки дня данного пользователя.
И я думал, что я должен, вероятно, пойти с has_many :through
ассоциации вместо этого, таких как:
class User < ActiveRecord::Base
has_many :roles
has_many :agendas, through: :roles
end
class Role < ActiveRecord::Base
belongs_to :user
belongs_to :agenda
end
class Agenda < ActiveRecord::Base
has_many :roles
has_many :users, through: :roles
end
И хотя я был довольно комфортно об идее user
, имеющих нескольких roles
(по одному для каждого agenda
), я я не уверен в идее agenda
, имеющей несколько roles
(по одному для каждого user
?).
Наконец, чтобы добавить к путанице, я прочитал о полиморфной ассоциации и думал, что это может быть жизнеспособным решением, если сделано таким образом, к примеру:
class Role < ActiveRecord::Base
belongs_to :definition, polymorphic: true
end
class User < ActiveRecord::Base
has_many :roles, as: :definition
end
class Agenda < ActiveRecord::Base
has_many :roles, as: :definition
end
ли какой-либо из перечисленных выше решений звука правых для ситуации?
UPDATE: Выполнение некоторых исследований, я наткнулся на эту статью (с 2012 года), объясняя, что has_many :through
был «умнее», чем выбор has_and_belongs_to_many
. В моем случае я все еще не уверен в том, что у agenda
будет много roles
.
ОБНОВЛЕНИЕ 2: Как было предложено в комментариях от @engineersmnkyn, способом решения этого было бы пойти с двумя таблицами соединений. Я попытался реализовать следующий код:
class User < ActiveRecord::Base
has_many :agendas, through: :jointable
end
class Agenda < ActiveRecord::Base
end
class Role < ActiveRecord::Base
end
class Jointable < ActiveRecord::Base
belongs_to :user
belongs_to :agenda
has_many :agendaroles through :jointable2
end
class Jointable2 < ActiveRecord::Base
belongs_to :roles
belongs_to :useragenda
end
Я не уверен в синтаксисе. Я на правильном пути? И как мне определить модели Agenda
и Role
?
UPDATE 3: Что делать, если я пошел что-то вроде:
class User < ActiveRecord::Base
has_many :roles
has_many :agendas, through: :roles
end
class Role < ActiveRecord::Base
belongs_to :user
belongs_to :agenda
end
class Agenda < ActiveRecord::Base
has_many :roles
has_many :users, through: :roles
end
, а затем, в файле миграции, идти с чем-то вроде:
class CreateRoles < ActiveRecord::Migration
def change
create_table :roles do |t|
t.belongs_to :user, index: true
t.belongs_to :agenda, index: true
t.string :privilege
t.timestamps
end
end
end
Смогу ли я позвонить @ user.agenda.privilege, чтобы получить привилегию («роль» создателя, редактора или зрителя) данного пользователя для данной повестки дня?
С другой стороны, мог бы я позвонить @ Agenda.user.privilege?
Почему бы не настроить пользователя на множество планов через таблицу соединений, принадлежащую пользователю и повестке дня, и имеет много функций повестки дня через таблицу соединений, которая относится к повестке дня и ролям пользователей. Я бы написал его для вас, но сейчас я не на компьютере. – engineersmnky
Благодаря @engineersmnky это имеет большой смысл, поскольку он фиксирует проблему повесток дня, не имеющих много ролей. Если я правильно понял, что вы предложили, код будет выглядеть примерно так: https://repl.it/tNS. Я не уверен в синтаксисе. –