find_or_initialize_by非唯一属性

时间:2013-10-21 16:41:05

标签: ruby-on-rails csv

我有一个InventoryItem模型如下:

class InventoryItem < ActiveRecord::Base

    belongs_to  :item, :foreign_key => :code, :primary_key => :code
    belongs_to  :vendor
    has_many    :list_items
    has_many    :shopping_lists, through: :list_items

    def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
        InventoryItem.create! row.to_hash
    end
  end
end

我想修改self.import方法,以便我可以上传一个csv文件,它将find_or_initialize。通过这种方式,我可以更新库存而无需删除它,并在每次价格变化时重新填充。我的问题是我找不到主:id属性,因为传入的CSV文件不知道这些id。这是InventoryItem的表格模式:

class InventoryItems < ActiveRecord::Migration
  def change
    create_table :inventory_items do |t|
        t.decimal :price
        t.integer :vendor_id
        t.integer :code, :limit => 8
    end

    add_index :inventory_items, [:code, :vendor_id]
  end
end

:code并不是唯一的,因为许多其他供应商拥有相同代码的相同产品。有没有办法通过find_or_initialize_by代码和vendor_id?您是否看到了我正在尝试做的其他任何解决方法?任何帮助深表感谢。提前谢谢!

修改

好的,所以我的方法现在看起来像这样:

def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
        my_object = InventoryItem.find_or_initialize_by_code_and_vendor_id(code, vendor_id)
        my_object.update_attributes(row.to_hash)
    end
end

但是如何将每个代码和vendor_id传递给find_or_initialize_by?

1 个答案:

答案 0 :(得分:1)

你可以做到

InventoryItem.find_or_initialize_by_code_and_vendor_id(code, vendor_id)