我有一个 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
不是唯一的,因为许多其他供应商都有相同的产品和相同的代码。有什么方法可以同时通过代码和 vendor_id 找到_or_initialize_?您是否看到我正在尝试做的任何其他解决方法?任何帮助深表感谢。提前致谢!
编辑
好的,所以我有一个现在看起来像这样的方法:
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?