Как реализовать несколько ассоциаций между моделями? - PullRequest
0 голосов
/ 05 июня 2018

У меня 4 модели.

  1. UserModel
  2. SkillModel
  3. UserSkillModel
  4. PreferenceSkillModel

Ассоциация, которую я использовал:

UserModel
has_many :skills, through: :user_skills
has_many :user_skills
has_many :skills, :through: :preference_skills
has_many :preference_skills

SkillModel
has_many :users, through: :user_skills
has_many :users_skills
has_many :users, :through: :preference_skills
has_many :preference_skills

UserSkillModel
belongs_to :user
belongs_to :skill

PreferenceSkillModel
belongs_to :user
belongs_to :skill

Схема:

create_table "preference_skills", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.integer "user_id", default: 0
    t.integer "skill_id", default: 0
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
end

 create_table "user_skills", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.integer "user_id"
    t.integer "skill_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
end

create_table "skills", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "name", default: ""
    t.integer "skill_count", default: 0
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
end

Как правильно реализовать эту ассоциацию?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Как правильно реализовать эту связь?

Что может быть правильным, зависит от того, что вы пытаетесь сделать.Следующее является правильным, называя отдельные ассоциации для users-skill-ов и users-preference_skills.

class User
  has_many :user_skills
  has_many :my_skills, through: :user_skills, class_name: 'Skill'
  has_many :preference_skills
  has_many :my_preference_skills, :through: :preference_skills, class_name: 'Skill'
  ...
end

class SkillModel
  has_many :users_skills
  has_many :direct_users, through: :user_skills, class_name: 'User'
  has_many :preference_skills
  has_many :preference_users, :through: :preference_skills, class_name: 'User'
  ...
end

Если вы хотите одну коллекцию со всеми навыками, вам нужно использовать STI или полиморфизм.Прочтите Rails Guides для получения дополнительной информации.

0 голосов
/ 05 июня 2018

Не думаю, что есть необходимость в отдельных user_skills и preference_skills моделях.Вы можете использовать STI здесь как -

skill.rb Skill end

user_skill.rb

UserSkill < Skill
end

preference_skill.rb

PreferenceSkill < Skill
end

Примечание. Модель Skill, которую я использовал, отличается от того, что вы предполагаете.Возможно, вы захотите переименовать вашу текущую модель Skills в более понятное имя, например SkillDetail.

. После этого вы можете иметь ассоциации: -

class User < AR
  has_many :skills
  has_many :skill_details, through: :skills
end

class Skill < AR
  belongs_to :user
  belongs_to :skill_detail
end

class SkillDetail < AR
  has_many :skills
  has_many :users, through: :skills
end

PS Проведите небольшое исследование Single Table Inheritance (STI)

Надеюсь, это поможет.Также обратите внимание, что вы получили отрицательный ответ, потому что это очень расплывчатый вопрос, и вы прямо просите реализовать бизнес-логику.

...