2016-08-26 18 views
2

UserSkillテーブルに存在しないすべてのスキルをcurrent_userで取得する方法を教えてください。rails 5 HABTM associations

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

class Skill < ApplicationRecord 
    has_many :user_skills 
    has_many :users, through: :user_skills 
    end 

class UserSkill < ApplicationRecord 
    belongs_to :user 
    belongs_to :skill 
end 

私はこれを試してみました:ちょうどスキルテーブルに存在するすべてのスキルをロード

@available_user_skills = Skill.includes(:user_skills).where.not(:user_skills => { :user_id => current_user }) 

を。

答えて

0

私はあなたがnot_user_skillsが

は、この情報がお役に立てば幸いCURRENT_USERに属していないスキルですここでは、この

user_skill_ids = UserSkill.where(user_id: current_user.id).pluck(:skill_id) 
not_user_skills = Skill.where.not(id: user_skill_ids) 

または1行で

not_user_skills = Skill.where.not(id: current_user.skills.pluck(:id)) 

を探していると思います!

+0

こんにちはRSB - 同じ結果がすべてのスキルが読み込まれます。 –

+0

追加したばかりの2番目の方法を試してみてください。 – RSB

+1

トリックをした@RSBに感謝します –

0

は、以下のように試してみてください。

Skill.includes(:user_skills).where.not(user_skills: {users: {id: current_user.id}}) 
+0

このエラーを取得する 'SQLite3 :: SQLException:そのような列はありません:users.id:SELECT"スキル "。" ID "AS t0_r0"スキル "。"名前 "AS t0_r1" "user_skills"。 "user_id" AS t1_r1、 "user_skills"。 "skill_id" AS t1_r2 "スキル"から "created_at" AS t0_r2、 "スキル"。 "updated_at" AS t0_r3、 "user_skills" –

0
Skill.joins("LEFT OUTER JOIN user_skills ON skills.id = user_skills.skill_id").where("user_skills.user_id != #{current_user.id}") 

・ホープ、このことができます。

+0

LEFT JOINはすべてのスキルを返します。 – RSB

+0

Where句は除外されます(WHERE( "users"、 "id"!=?)スキルこれを1つのクエリで実行しようとしました。 –