使用嵌套模型的Rails Raw Sql插入

时间:2011-12-13 23:27:21

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

处理原始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输入子模型?

以上只是一个测试,我知道它并不完美。任何建议表示赞赏。

1 个答案:

答案 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语句

[1] - http://rubydoc.info/gems/pg/0.10.0/PGresult