错误:缺少表“self”的FROM子句条目(Rails 4 Active Record事务,postgresql 9.4))

在创建模型交易时,我使用after_create在DealPrize表上创建奖品。

Deal和DealPrize属于/ has_many关系:a Deal有许多Deal奖品,Dealprize属于Deal。

它的工作方式如下:在Deal中,我有一个列’prize-number’,我使用了after_create,以便amdin创建一个新的交易evetytime,应用程序获取此prize_number列,并创建此批量的奖品(插入尽可能多的行必要时)在DealPrize表中。

我无法在postgresql查询中使用我的Rails app moel变量。

这是一个有效的查询( 使用数字代替变量 )。 它将它写在我的数据库上。

model deals.rb

CONNEXION = ActiveRecord::Base.connection def create_prizes Deal.transaction do self.120000.times do |i| CONNEXION.execute "INSERT INTO deal_prizes (deal_id, created_at, updated_at) values ( 62, '2009-01-23 20:21:13', '2009-01-23 20:21:13')" end end end 

但是,当我按照应变量替换示例值时,我得到一个错误。

 CONNEXION = ActiveRecord::Base.connection def create_prizes Deal.transaction do self.120000.times do |i| CONNEXION.execute "INSERT INTO deal_prizes (deal_id, created_at, updated_at) values ( self.id, '2009-01-23 20:21:13', '2009-01-23 20:21:13')" end end end 

如果我使用self.if,我会收到错误

 ERROR: missing FROM-clause entry for table "self" 

我也试过self.id,id,deal.id,deal_id,self_id,什么都行不通。

谢谢你的帮助,

编辑 – 为dimakura添加

在使用原始sql和事务进行优化之前:

 def create_prizes self.1200000.times do prizes = DealPrize.create(:deal_id => self.id, :admin_user_id => self.admin_user_id) prizes.save end end 

最新代码在dimakura的帮助下

 CONNEXION = ActiveRecord::Base.connection def create_prizes Deal.transaction do self.1200000.times do |i| st = CONNEXION.raw_connection.prepare("INSERT INTO deal_prizes (deal_id, created_at, updated_at) values (?, ?, ?)") st.execute(self.id, Time.now, Time.now) st.close end end end 

得到错误:

 wrong number of arguments (1 for 2..3) 

它应该是:

 CONNEXION.execute "INSERT INTO deal_prizes (deal_id, created_at, updated_at) values ( #{self.id}, '2009-01-23 20:21:13', '2009-01-23 20:21:13')" 

但这不是推荐的方法。 你永远不应该像这样插入参数。

更好的方法是:

 st = CONNEXION.raw_connection.prepare("INSERT INTO deal_prizes (deal_id, created_at, updated_at) values (?, ?, ?)") st.execute(self.id, Time.now, Time.now) st.close 

你必须使用字符串插值,即#{self.id}而不是self.id

  def create_prizes Deal.transaction do self.120000.times do |i| CONNEXION.execute "INSERT INTO deal_prizes (deal_id, created_at, updated_at) values ( #{self.id}, '2009-01-23 20:21:13', '2009-01-23 20:21:13')" end end end