HABTM relation find all records, excluding some based on association

故事扮演 提交于 2019-12-02 01:33:45

You can place a scope in your Project model like so:

scope :not_belonging_to, lambda {|user| joins(:projects_users).where('projects_users.user_id <> ?', user.id) }}

This assumes your join table name matches rails convention for HABTM associations

To then get projects that a user doesn't belong to, first find your user, then pass them to the scope like so:

@user = User.find(params[:id]) # example
@unowned_projects = Project.not_belonging_to(@user)

On reflection, that scope won't work as it will find projects that have more than one developer, if one of those is your guy.

Instead, use the following:

scope :not_belonging_to, lambda {|user| where('id NOT IN (?)', user.projects.empty? ? '' : user.projects) }

From Matt's reply above, which was extremely helpful.

I had trouble with this for a while. I attempted to use the following:

scope :not_belonging_to, lambda {|developer| where('id NOT IN (?)', developer.projects.empty? ? '' : developer.projects) }

But I received the following error:

SQLite3::SQLException: only a single result allowed for a SELECT that is part of an expression:

I found I needed to update the scope, adding .ids on the end. See below:

scope :not_belonging_to, lambda {|developer| where('id NOT IN (?)', developer.projects.empty? ? '' : developer.projects.ids) }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!