Rails不要构建两次has_one关系

时间:2015-04-06 10:05:21

标签: ruby-on-rails ruby activerecord

我在用户和电子钱包之间有一个has_one关系。

#User
 has_one :wallet

#Wallet
 belongs_to :user
 validates :user, allow_blank: true, uniqueness: true
 validates :key, presence: true
 validate :address, if: valid_address?

def valid_address?
 stuff
end

我想阻止重建先前制作的钱包。

因为如果我做User.last.build_wallet(键:" key1")。保存 我将在我的数据库中

id  key     address user_id created_at
1   test1   NULL    1       2015-04-06 09:38:54 2015-04-06 09:38:55

但如果我以同样的方式重建,我将有第二个条目

id  key     address user_id created_at
1   test1   NULL    NULL    2015-04-06 09:38:54 2015-04-06 09:38:55
2   test1   NULL    1       2015-04-06 09:38:54 2015-04-06 09:38:55

它会添加一个新条目,并从第一个条目中删除用户ID。

3 个答案:

答案 0 :(得分:0)

使用find_or_create_by_

User.wallet.find_or_create_by_key("key1")

它将检查记录是否已经存在,否则它将创建一个新记录。

答案 1 :(得分:0)

查看用户是否已拥有钱包,然后进行构建,如下所示:

wallet_attrs = {key: "key1"}
@wallet = User.last.wallet || User.last.build_wallet(wallet_attrs)
@wallet.save

答案 2 :(得分:0)

您可以在模型中设置验证:

validates_uniqueness_of :key, :message => "This key is already present."