在Rails中验证外键关联的最佳方法是什么属于当前用户

时间:2015-03-31 01:36:17

标签: ruby-on-rails foreign-keys

例如,假设我的信用卡属于具有相关帐单邮寄地址的用户。

一种解决方案是我在创建/更新块中分配关系。但是,这确实需要我处理诸如空白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'),它也处理验证。这样做有更好的模式吗?

1 个答案:

答案 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