来自has_many的find_or_initialize_by属性

时间:2012-07-29 09:00:40

标签: ruby-on-rails ruby-on-rails-3 activerecord

因此,我正在尝试实施批量导入,即文本区域,人们可以在其中以“金额卡名”的形式编写卡片列表。然后Rails占用每一行,找到金额和卡片名称(该部分正在工作)并将其添加到数据库(此部分不起作用)。

我的数据库:

  • 卡片(身份证,姓名) - 已经填好,我不想在这里创建任何东西
  • 用户(身份证,姓名)
  • hass(id,card_id,user_id,amount)

关系

  • 用户has_many hass
  • card has_many haves
  • 拥有belongs_to卡和用户
> cards_bulk.each_line do |line|
>   card_data = /(^\d.?\s)(.+)/.match(line)
> end

此代码遍历文本区域内容并正则表示正确的部分,因此我在card_data [0]中有我的金额,在card_data [2]中有我的名字。

现在我想将该卡添加到此用户的手中。如果它已经存在,我想将金额添加到它已有的金额。如果它不存在,我想创建它并将其数量设置为给定的数量。我不太确定我会怎么做。

由于

2 个答案:

答案 0 :(得分:0)

你可以这样做:

card = Card.find_or_create_by_name(card_data[2])
haves = Have.find(:card => card, :user => user)
if haves.empty?
  card.haves.create(:amount => card_data[0].to_i, :user => user)
else
  haves.update_attibutes(:amount => (haves.amount + card_data[0].to_i))
end

答案 1 :(得分:0)

你可以使用new_record吗?帮助救援

card = Card.find_or_create_by_name(card_data[2])
haves = card.haves.find_or_initialize_by_user_id(user)
haves.amount = haves.new_record? ? card_data[0].to_i : haves.amount + card_data[0].to_1
card.save