2011-12-13 6 views
0

生のSQLインサートとネストされた属性を処理する最善の方法は何ですか?Rails3ネストされたモデルを使用したRaw SQL Insert

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

sql文にはRETURNING idを入れる必要があります.SQLを実行するときには、挿入されたクエリのIDのハッシュの順序付き配列があります。より明確に: - http://rubydoc.info/gems/pg/0.10.0/PGresult

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]に値を挿入することができるようになります

関連する問題