2015-11-14 4 views
1

это мой создать метод в контроллере:Rails MySQL не может одного массового вставить

def create 
    @promo = current_user.promos.build(promo_params) 

    if @promo.save 
     inserts = [] 
     params[:user_limit].to_i.times do 
     inserts.push "(#{@promo.id}, #{SecureRandom.hex(3).upcase})" 
     end 
     sql = "INSERT INTO vouchers ('promo_id', 'promo_code') VALUES #{inserts.join(", ")}" 
     ActiveRecord::Base.connection.execute(sql) 

     redirect_to provider_promo_path(@promo), notice: 'Promo was successfully created.' 
    else 
     render :new 
    end 
    end 

Моя Ваучер схема таблицы:

class Voucher < ActiveRecord::Base { 
      :id => :integer, 
     :promo_id => :integer, 
    :promo_code => :string, 
     :email => :string, 
     :status => :integer, 
     :user_id => :integer, 
    :created_at => :datetime, 
    :updated_at => :datetime 
} 

в вышеуказанном способе контроллера я только хочу, чтобы заполнить поле promo_id и promo_code , Это вызывает ошибку? Здесь ошибка возврат сообщения:

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''promo_id', 'promo_code') VALUES' at line 1: INSERT INTO vouchers ('promo_id', 'promo_code') VALUES 

указывая на эту линию:

ActiveRecord::Base.connection.execute(sql) 

Любые предлагает? благодаря

UPDATE

У меня есть отредактировать свой код:

inserts.push "(#{@promo.id}, '#{SecureRandom.hex(3).upcase}')" 

Но у меня есть другая ошибка, которая говорит:

ActiveRecord::StatementInvalid in Provider::PromosController#create 
Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''promo_id', 'promo_code') VALUES (20, 'C23E37'), (20, '2A70D0'), (20, '6557DC')' at line 1: INSERT INTO vouchers ('promo_id', 'promo_code') VALUES (20, 'C23E37'), (20, '2A70D0'), (20, '6557DC') 

sql переменное значение:

"INSERT INTO vouchers ('promo_id', 'promo_code') VALUES (21, '0D8D52'), (21, '1F6E58'), (21, 'C049DC')" 

почему это все еще ошибка?

+0

Проверьте SQL-запрос, который формируется, есть синтаксическая ошибка в запросе –

+0

См. Мой обновленный вопрос –

+1

SQL-Injection: никогда не записывайте заданные пользователем параметры непосредственно в Sting. – Meier

ответ

0

Это:

inserts.push "(#{@promo.id}, #{SecureRandom.hex(3).upcase})" 

должно быть:

inserts.push "(#{@promo.id}, '#{SecureRandom.hex(3).upcase}')" 

SecureRandom.hex(3).upcase является строкой, поэтому он должен быть в кавычках в запросе.

Кроме того, это неправильно:

INSERT INTO vouchers ('promo_id', 'promo_code') 

Оно должно быть:

INSERT INTO vouchers (`promo_id`, `promo_code`) 

Вы не можете использовать кавычки имена столбцов в MySQL.

+0

Привет, спасибо, я забыл это.См. Мои обновленные вопросы. –

+0

@KrisMP. Вы должны удалить кавычки или заменить их обратными окнами ('\' ') в этом разделе:' INSERT INTO vouchers ('promo_id', 'promo_code') '. Вы не можете использовать кавычки вокруг имен столбцов в MySQL. – Mischa

0

Вы можете попробовать сделать это по-другому.

Построить массив хэш для всех ваших записей:

inserts = [] 
params[:user_limit].to_i.times do 
    record = {} 
    record['promo_id'] = @promo.id 
    record['promo_code'] = "#{SecureRandom.hex(3).upcase}" 
    inserts << record 
end 

А, а затем создать ваучера:

Voucher.create(inserts) 
Смежные вопросы