【问题标题】:find_or_initialize_by attribute from has_many来自 has_many 的 find_or_initialize_by 属性
【发布时间】:2012-07-27 07:44:30
【问题描述】:

所以,我正在尝试实现批量导入,即一个文本区域,人们可以在其中以“金额卡名”的形式编写他们的卡列表。然后 Rails 获取每一行,找到金额和卡名(该部分有效)并将其添加到数据库中(该部分无效)。

我的数据库:

  • 卡片(ID、姓名) - 已填写,我不想在这里创建任何内容
  • 用户(ID、姓名)
  • 拥有(id、card_id、user_id、金额)

关系

  • 用户 has_many hass
  • card has_many haves
  • 拥有belongs_to卡和用户
> card_bulk.each_line 做 |line| > card_data = /(^\d.?\s)(.+)/.match(行) > 结束

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    你可以使用 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
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 1970-01-01
        • 2012-03-10
        • 2013-08-14
        • 1970-01-01
        相关资源
        最近更新 更多