我通过CSV导入我的Rails应用程序。导入工作直到我尝试使用CSV上的其中一列创建新联系人。这是导入数据的代码:
row = Hash[[header, spreadsheet.row(i)].transpose]
hotel = find_by_id(row["id"]) || new
hotel.attributes = row.to_hash.select { |k,v| allowed_attributes.include? k }
hotel_name = row["hotel_title"]
hotel_id = row["id"]
if row.to_hash["contact_name"]
hotel.contact = Contact.create(:hotel_id => row["id"], :name => row["contact_name"])
end
hotel.map = Map.create(:hotel_id => row["id"], :status => 0, :title => "Map Publication for #{hotel_name}")
hotel.app = App.create(:hotel_id => row["id"], :status => 0, :title => "Bespoke App for #{hotel_name}")
hotel.save!
当我运行导入时,我收到以下错误:
未定义的方法`contact ='对于#
联系人属于酒店,酒店 has_many 联系人。我使用应用程序创建了联系人,但我正在努力使用此导入方法使其工作。我不确定我在这里做错了什么,因为导入后地图和应用程序模型都被创建(带有酒店的ID)。当我包含与 contact_name 相关的代码时,导入现在失败。
class Contact < ActiveRecord::Base
belongs_to :hotel
end
class Hotel < ActiveRecord::Base
has_many :contacts
end
答案 0 :(得分:1)
您应该使用<<
运算符,因为它是复数关联:
hotel.contacts << Contact.create(name: row['contact_name'])
请注意,我从参数中删除了:hotel_id
键,因为它是冗余的(它已经通过关联设置)。
您也可以从关联的另一端开始:
Contact.create(name: row['contact_name'], hotel: hotel)
答案 1 :(得分:0)
只需删除hotel.contact =
即可。您不需要它,因为您在创建联系人记录时明确提供:hotel_id
。
所以,你需要替换
if row.to_hash["contact_name"]
hotel.contact = Contact.create(:hotel_id => row["id"], :name => row["contact_name"])
end
与
Contact.create(:hotel_id => row["id"], :name => row["contact_name"]) if row.to_hash["contact_name"]