2016-08-26 5 views
2

Как я могу получить все Навыки, которые еще не существуют в таблице UserSkill для current_user?рельсы 5 Ассоциации HABTM

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

Я думаю, что вы ищете для этого

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

или в одной строке

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

Здесь not_user_skills навыки, которые не принадлежат к CURRENT_USER

Надежда это помогает!

+0

Hi RSB - тот же результат, все навыки загружены. –

+0

Попробуйте второй подход, который я только что добавил. – RSB

+1

Спасибо @RSB, который сделал трюк –

0

Try, как показано ниже:

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

Получите эту ошибку 'SQLite3 :: SQLException: нет такого столбца: users.id: SELECT" skills "." Id "AS t0_r0," skills "." Name "AS t0_r1," skills " . "created_at" AS t0_r2, "skills". "updated_at" AS t0_r3, "user_skills". "id" AS t1_r0, "user_skills". "user_id" AS t1_r1, "user_skills". "skill_id" AS t1_r2 FROM "skills" LEFT OUTER JOIN «user_skills» ON «user_skills». «Skill_id» = «навыки». «Id» WHERE («users». «Id»! =?) ' –

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

Где будет отфильтровано предложение навыки. Пытался сделать это в одном запросе. –

Смежные вопросы