2010-05-18 4 views
0

У меня есть две модели Users и Roles. У меня есть множество отношений между двумя моделями, и у меня есть совместная таблица с именем roles_users.Ruby on Rails обновление записей в таблице соединений

У меня есть форма на странице со списком ролей, который пользователь проверяет флажок, и он отправляет сообщения в контроллер, который затем обновляет таблицу roles_users.

На данный момент в моем методе обновления я это делаю, потому что я не уверен, что лучший способ:

role_ids = params[:role_ids] 
user.roles.clear 
role_ids.each do |role| 
    user.roles << Role.find(role) 
end unless role_ids.nil? 

Поэтому я клиринговый все записи из затем перекручивания метали все роли идентификаторов, отправленных из форма через почту, я также заметил, что если все флажки отмечены, а в форме, в которой размещена, она добавляет повторяющиеся записи, может ли кто-нибудь дать совет по более эффективному способу сделать это?

ответ

2

Вы можете сделать прямое назначение, как и обрабатывает грязную работу за вас:

user.roles = params[:role_ids].present? ? Role.find_all_by_id(params[:role_ids]) : [ ] 

ActiveRecord следует позаботиться о создании новых ассоциаций или удаления тех, которые не перечислены. Если что-либо исключает возможность сохранения вашей модели объединения, например, неудачная проверка, могут возникнуть проблемы, но в большинстве ситуаций это должно работать должным образом.

Надеюсь, вы используете has_many ...,: для этого, а не устаревшего has_and_belongs_to_many, который преследует так много приложений Rails из-за старого кода примера.

+0

Улыбается, что работает отлично, я был интенсивным, используя has_and_belongs для многих, но прочитал о: сквозном подходе и переместил его на это. Еще раз спасибо. – RailsSon

+0

Должен быть user.roles = params [: role_ids] .present? ? Role.find_all_by_id (params [: role_ids]): [] – user938363

+0

Да, вы правы. Под редакцией! – tadman

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