Rails:保存具有多对多关系的记录

时间:2014-06-06 22:39:59

标签: ruby-on-rails ruby-on-rails-3

我找到了一个在Rails应用here中建立多对多关系的绝佳示例。该示例允许通过链接成员资格表创建用户并将其与组关联。 Rails框架神奇地创建并调用group_ids方法,其中包含使用用户记录提交的组列表。这一切都适用于新的用户记录。

但是,对于编辑,当请求参数应用于模型时,控制器会调用group_ids方法,这会立即更新数据库成员资格表。如果用户保存因任何原因失败,例如,它没有通过验证,则回滚用户字段,但会员资格的更改仍然存在。解决方案似乎要求进行交易。但是不鼓励使用控制器内的事务,并且由于Rails框架自动调用group_ids,我不知道还有什么地方可以放置它。这种情况有最好的做法吗?

1 个答案:

答案 0 :(得分:0)

首先,在控制中使用交易是完全可以的。 它不鼓励控制器中有太多逻辑。首先运行它然后运行 如果你的控制器活动正在做很多事情,那就把它提取到其他地方。

  

我不知道还能把它放在哪里。这种情况有最好的做法吗?

是的,把它放在一个模型对象中,这是buiseness逻辑应该留下的地方。并且不要被Rails欺骗。模型不仅仅是ActiveRecords,而是一切,而不是 视图或控制器。

请参阅7 Patterns to Refactor Fat ActiveRecord Models

但是,您也可以先通过批量分配用户属性来进行事务处理,如果成功,则分配group_ids

group_ids = params[:user].extract! 'group_ids' || []
user.update_attributes(group_ids) if user.update_attributes(params[:user] || {})

这种方法在99%的情况下都有效,因为交易时安全性较低,因为用户属性仍然可以更新,但如果是例如,db和rails app之间的网络错误。

恕我直言,如果两个步骤中只有一个成功,那就完全没问题了。有人想要更改用户数据并一次将用户分配给一些新组。小组任务很好,所以让我们坚持下去。配置文件是错误的,让我们显示错误,但为什么要重复组的分配呢?那将更不方便用户。