У меня есть две эти модели:
Collabs
- id
- title
# has_many :collaborations
Collaborations
- collab_id
- user_id
- status
# belongs_to :collab
# belong_to :user
В запросе я не хочу получать все коллаборации, где определенный user_id НЕ присутствует в дочерней (коллаборации) ассоциации.У колла может быть ноль ко многим коллаборациям, и коллаборации будут иметь разные user_id.
Я пробовал (используя области):
collabs = Collab.available_for_user(2)
scope :available_for_user, -> (user_id) { joins(:collaborations).where.not(collaborations: {user_id: user_id}) }
Я также пробовал:
scope :available_for_user, -> (user_id) { left_outer_joins(:collaborations).where.not(collaborations: {user_id: user_id}) }
Это SQL, который выводится в консоли:
SELECT "collabs".* FROM "collabs" LEFT OUTER JOIN "collaborations" ON "collaborations"."collab_id" = "collabs"."id" WHERE ("collaborations"."user_id" != $1) [["user_id", 13]]
Это работает, если дочерние ассоциации имеют только предоставленный user_id, но коллаб имеет другое сотрудничество с другим user_id, тогда этоколлаб доставляется с помощью областей, описанных выше.