例如,假设我的信用卡属于具有相关帐单邮寄地址的用户。
一种解决方案是我在创建/更新块中分配关系。但是,这确实需要我处理诸如空白ID或不存在记录之类的错误。希望有一个我忽略的更好的解决方案。
我有兴趣确保属于另一个用户的地址未分配给当前用户。
所以,创建解决方案的代码:
credit_card = current_user.credit_cards.create!(credit_card_params) do |credit_card|
credit_card.address = User.addresses.find(params['credit_card']['address_id'])
end
我还没有添加错误处理,可以将其推送到User对象中的类方法,然后调用User.set_address('address_id'),它也处理验证。这样做有更好的模式吗?
答案 0 :(得分:1)
如果我们从信用卡的角度来看,您只需要确保address_id
是唯一的,这意味着address_id
不能在两张不同的信用卡上使用两次
class CreditCard < ActiveRecord::Base
validates :address_id, uniqueness: true
end
如果使用属于其他用户的address_id
初始化新信用卡,则信用卡将失效。
更新:通过向唯一性验证添加范围,您允许复制较小的集合,在您的情况下将是user_id
(如果2个信用卡具有相同的地址,并且相同的用户则那么没问题)
class CreditCard < ActiveRecord::Base
validates :address_id, uniqueness: { scope: user_id }
end