确保关联的列是唯一的

时间:2018-12-03 09:41:05

标签: ruby-on-rails ruby

问题::我想确保一列是唯一的,并且如果发生更新/创建,它不会创建新行,而只会编辑现有行。

更具针对性的问题:我有一个带区号帐户表,该表以前通过以下代码与用户相关联:

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相关联的当前行,而无需创建新行?

1 个答案:

答案 0 :(得分:2)

更新记录时需要执行此操作。进行验证可以确保不允许同一用户拥有多个StripeAccount,但是您必须进行验证。因此,要更新记录或创建一条不存在的记录,您可以使用find_or_create_by并按useruser_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