2012-01-17 34 views
3

新手问题。ActiveRecord :: Base.connection.execute(..)正在寻找具有值名称的列我试图插入表

我想在Ruby 3.1的应用程序和文档,我已阅读使用的ActiveRecord :: Base.connection.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 

和IM与打码如下:

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) 
+1

你必须引用你的值 – lucapette 2012-01-17 16:10:10

回答

3

你从哪里得到这个基础?这个品种的代码是一个英镑的例子不要做什么

如果你有ActiveRecord,那么你有ActiveRecord :: Model,并且你正处在正确的轨道上,并且完成了很多工作。您不需要为此类常规事情编写原始SQL。这不是必要的,而且更重要的是,由于你刚发现的原因,这是非常危险的。你不能随意地将事情推到你的查询中,否则你最终只会遇到麻烦。

什么,你应该做的是声明一个模型,然后使用它:

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

要插入一旦你有一个模型是由严重简单:

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

一个很好的ActiveRecord的参考是无价的因为如果你使用它,这个设施将使你的生活变得更容易。

轨之内你平时去自动生成这些让你有一些粗糙入手:

rails generate model country 

这将需要创建迁移文件,模型文件的照顾,有的单元测试存根你可以稍后填写。

1

错误只是因为如果缺少引号。它应该是这样的:

INSERT INTO countries ('iso3', 'iso2', 'name') VALUES ('Null', 'ZA', 'SouthAfrica') 
相关问题