Rails3 Raw Sql Insert с вложенными моделями - PullRequest
0 голосов
/ 14 декабря 2011

Какой лучший способ справиться с необработанной вставкой 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 Ответ

1 голос
/ 13 января 2012

Вы должны поместить RETURNING id в оператор sql, чтобы при выполнении SQL вы имели упорядоченный массив хэшей идентификаторов вставленных запросов.Более четко:

   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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...