Rails 4 has_many through with where clause deletes multiple associations -


i have project model has various roles users. user may have multiple roles project. have set project model associations has_many through , clause show type of role:

  has_many :project_user_roles, dependent: :destroy    has_many :sub_contractors,            -> { where(project_user_roles: {role: 'subcontractor'}) },            through: :project_user_roles,            source: :user    has_many :consultants,           -> { where(project_user_roles: {role: 'consultant'}) },           through: :project_user_roles,           source: :user 

in project controller, can update sub_contractor_ids , consultant_ids. works fine adding , deleting roles situations except user both subcontractor , consultant, , consultant role removed. in case, roles removed!. param hash passed correct:

parameters: {"utf8"=>"✓", "project"=>{"sub_contractor_ids"=>["3", ""], "consultant_ids"=>[""] ... 

, can see in console update_attributes command results in sql:

sql (0.2ms)  delete "project_user_roles" "project_user_roles"."project_id" = $1 , "project_user_roles"."user_id" = 3  [["project_id", 3]] 

which not account clause in association should limit delete roles 'consultant'.

as mention above, adding roles fine i.e. if there no roles user , same params passed:

parameters: {"utf8"=>"✓", "project"=>{"sub_contractor_ids"=>["3", ""], "consultant_ids"=>[""] ... 

the resulting sql includes role clause:

sql (0.4ms)  insert "project_user_roles" ("role", "project_id", "user_id", "created_at", "updated_at") values ($1, $2, $3, $4, $5) returning "id"  [["role", "subcontractor"], ["project_id", 3], ["user_id", 6], ["created_at", "2016-06-07 00:32:17.224502"], ["updated_at", "2016-06-07 00:32:17.224502"]] 

i either not understanding clause correctly or not best way set up. appreciated.

while not 100% sure why works seems equivalent me, how have associations set now:

has_many :consultant_roles,           -> { where(project_user_roles: {role: 'consultant'}) },           class_name: "projectuserrole" has_many :sub_contractor_roles,           -> { where(project_user_roles: {role: 'subcontractor'}) },           class_name: "projectuserrole"  has_many :main_contractors,            through: :main_contractor_roles,            source: :user  has_many :sub_contractors,            through: :sub_contractor_roles,            source: :user