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

Не могу понять, как реализовать метод primary_skill.Этот метод должен возвращать навык, помеченный как основной user.primary_skill

class User < ApplicationRecord
  has_many :user_skills
  has_many :skills, through: :user_skills
end

class Skill < ApplicationRecord
  validates :title, presence: true, uniqueness: true

  has_many :user_skills
  has_many :users, through: :user_skills
end

class UserSkill < ApplicationRecord
  belongs_to :skill
  belongs_to :user
end

create_table "user_skills", force: :cascade do |t|
  t.boolean "primary", default: false
  t.bigint "skill_id"
  t.bigint "user_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.index ["skill_id"], name: "index_user_skills_on_skill_id"
  t.index ["user_id"], name: "index_user_skills_on_user_id"
end

1 Ответ

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

Ответ от @Alec почти наверняка приведет к синтаксической ошибке, блок не может логически оценить это выражение.

Вы можете добиться этого следующим образом:

class User < ApplicationRecord
  has_many :user_skills
  has_many :skills, through: :user_skills
  has_many :primary_user_skills, -> { where(primary: true) }, class_name: 'UserSkill'
  # Above cannot be has_one, we are creating intermediate relationship from user_skills where primary is true.

  def primary_skill
    primary_user_skills.first.try(:skill)
  end
end

Редактировать - упрощенная версия для того же может быть ниже:

class User < ApplicationRecord
  has_many :user_skills
  has_many :skills, through: :user_skills

  def primary_skill
    skills.find_by(user_skills: {primary: true})
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...