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