Здесь есть две разные ассоциации. Первая - это ассоциация «один ко многим». Пользователь может быть создателем любого количества умений. Вторая ассоциация «многие ко многим», у пользователя может быть много навыков, а у навыка может быть много пользователей.
Первая - это простая belongs_to <-> has_many
декларация. Для второго вам понадобится либо объявление has_and_belongs_to_many
в обеих моделях и соответствующая таблица соединений, либо выделенная модель соединения, а также объявление has_many :through
. Давайте попробуем первый:
Метод 1: HABTM
class User < ActiveRecord::Base
has_many :created_skills, :class_name => 'Skill', :inverse_of => :creator
has_and_belongs_to_many :skills
end
class Skill < ActiveRecord::Base
belongs_to :creator, :class_name => 'User', :inverse_of => :created_skills
has_and_belongs_to_many :users
end
Для этого требуется таблица соединений с названием «skill_users», в которой есть столбцы с именами user_id
и skill_id
Метод 2: Проходит много (Присоединиться к модели)
Второй аналогичен, но добавляет модель, которая действует как посредник. Это дает дополнительное преимущество, заключающееся в том, что вы можете включить дополнительные столбцы в модель объединения, например, уровень квалификации.
class User < ActiveRecord::Base
has_many :created_skills, :class_name => 'Skill', :inverse_of => :creator
has_many :user_skills
has_many :skills, :through => :user_skills
end
class Skill < ActiveRecord::Base
belongs_to :creator, :class_name => 'User', :inverse_of => :created_skills
has_many :user_skills
has_many :users, :through => :user_skills
end
class UserSkill < ActiveRecord::Base
belongs_to :user
belongs_to :skill
end