处理原始sql插入和嵌套属性的最佳方法是什么?
我的父模型有:
has_many :kids, :dependent => :destroy
accepts_nested_attributes_for :kids
def self.sql_insert
parent_name = []
kid_name = []
10.times do
parent_name.push "('jenny_blunt')"
kid_name.push "('some_name', '#{parent_id}')"
end
sql1 = "INSERT INTO parents (`name`) VALUES #{parent_name.join(", ")}"
sql2 = "INSERT INTO kids (`name`, `parent_id`) VALUES #{parent_name.join(", ")}"
ActiveRecord::Base.connection.execute sql1
ActiveRecord::Base.connection.execute sql2
端
当我运行它时,parent_id是空白的(显然)。
如何让它将parent_id输入子模型?
以上只是一个测试,我知道它并不完美。任何建议表示赞赏。
答案 0 :(得分:1)
您应该在sql语句中放置一个RETURNING id
,因此当您执行SQL时,您有一个有序的插入查询的ID哈希数组。更清楚:
sql1 = "INSERT INTO parents (`name`) VALUES #{parent_name.join(", ")} RETURNING id"
h_ids = ActiveRecord::Base.connection.execute sql1 #This returns a PGresult[1]
ids = h_ids.map {|h| h['id']} #Now you have an array of ids
使用该数组,您可以将值插入下一个sql语句