问题::我想确保一列是唯一的,并且如果发生更新/创建,它不会创建新行,而只会编辑现有行。
更具针对性的问题:我有一个带区号帐户表,该表以前通过以下代码与用户相关联:
stripe_account.rb(模型)
belongs_to :user, optional: true
has_one :bank_account
validates :user_id, presence: true, uniqueness: true
这行得通。
尽管,我最近添加了一个新的设计模型Affiliates,这是它自己的模型和表格,“ has_many:users” ..它将用于将关联帐户附加到Users,因此当用户销售产品,就会通过条纹获得会员佣金。
现在,在测试为会员创建条纹帐户时遇到了一个问题(用户现在将发生同样的问题)。
我有这个模型:
belongs_to :user, optional: true
belongs_to :affiliate, optional: true
has_one :bank_account
validates :user_id, presence: true, uniqueness: true
validates :affiliate_id, presence: true, uniqueness: true
问题是,“验证”-如果我使用current_affiliate登录,则我需要注释掉user_id才能使其正常工作,反之亦然。
当我将它们完全拿走时,表格将创建一个新行。现在,它确实擦除了stripe_account表中的“ affiliate_id”或“ user_id”参数,但是保留了该行,这意味着它创建了一个新的stripe_account ID-这很不方便。我需要它来简单地覆盖用户已经关联的当前ID(行),就像我在添加新的Devise模型之前的工作方式一样。
如何做到这一点,以便编辑/更新仅覆盖已经与登录用户或会员ID相关联的当前行,而无需创建新行?
答案 0 :(得分:2)
更新记录时需要执行此操作。进行验证可以确保不允许同一用户拥有多个StripeAccount,但是您必须进行验证。因此,要更新记录或创建一条不存在的记录,您可以使用find_or_create_by
并按user
或user_id
进行查找,就像(我不知道您要更新的字段):
StripeAccount.find_or_create_by(user: user) do |stripe_account|
stripe_account.bank = bank
stripe_account.money = 20
end
顺便说一句,在验证过程中,您可能希望验证user
而不是user_id
的存在,因为这不仅可以确保设置了字段user_id
,而且可以确保有一个具有该ID的用户:
validates :user, presence: true, uniqueness: true