错误:缺少表“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