ActiveRecord :: Base.connection.execute (..) ищет столбец с именем значения, которое я пытаюсь вставить в таблицу - PullRequest
3 голосов
/ 17 января 2012

Вопрос новичка.

Я пытаюсь использовать ActiveRecord :: Base.connection.execute (..) в приложении ruby ​​3.1, и документы, которые я прочитал, кажутся простыми, но для жизни во мнеКажется, я понимаю, почему я не могу заставить код ниже работать.Полученное сообщение об ошибке указывает на то, что функция execute ищет столбец с именем одного из значений, которые я пытаюсь сохранить, но я не понимаю, почему.

Во-первых, моя структура таблицы БД выглядит следующим образом:

  create_table "countries", :force => true do |t|
    t.string   "iso3"
    t.string   "iso2"
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

И код, с которым я играю, выглядит следующим образом:

code = 'ZA'
name = 'South Africa'

ActiveRecord::Base.connection.execute("INSERT INTO countries ('iso3', 'iso2', 'name')
  VALUES ('Null', #{code}, #{name})")

Я получаю следующее сообщение об ошибке:

SQLite3::SQLException: no such column: ZA: INSERT INTO countries ('iso3', 'iso2', 'name')
                                                VALUES ('Null', ZA, SouthAfrica)

Ответы [ 2 ]

3 голосов
/ 17 января 2012

Где ты взял основание для этого?Код этого сорта является отличным примером что не нужно делать .

Если у вас есть ActiveRecord, то у вас есть ActiveRecord :: Model, и с этим вы на правильном пути ив значительной степени сделано.Вам не нужно писать сырой SQL для рутинных вещей этого разнообразия.Это не обязательно, и более того, это чрезвычайно опасно по причинам, которые вы только что обнаружили.Вы не можете просто засунуть в свой запрос случайные вещи, иначе у вас не останется ничего, кроме проблем.

Что вам нужно сделать, это объявить модель и затем использовать ее:

# Typically app/models/country.rb
class Country < ActiveRecord::Base
end

Вставить, как только у вас есть модель, очень легко:

Country.create(
  :code => 'ZA',
  :name => 'South Africa'
)

Хороший справочник ActiveRecord неоценим, так как эта возможность значительно облегчит вашу жизнь, если вы ее используете.

В Rails вы обычно генерируете их автоматически, чтобы начать с чего-то сложного:

rails generate model country

Это позаботится о создании файла миграции, файла модели и некоторых заглушек модульного теста, которые вы можете заполнитьпозже.

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

Ошибка только потому, что в пропущенных кавычках.это должно быть как:

INSERT INTO countries ('iso3', 'iso2', 'name') VALUES ('Null', 'ZA', 'SouthAfrica')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...