Heroku PG :: UndefinedColumn:ERROR不存在

时间:2016-11-10 15:49:59

标签: ruby-on-rails postgresql activerecord heroku rails-activerecord

这在rails服务器上运行良好,但不能在Heroku上运行并说出了问题等等。当我通过BPage_name搜索b_pages时,这基本上就会发生:

架构:

create_table "b_pages", force: :cascade do |t|
    t.string   "Bpage_name"
    t.string   "first_post"
    t.datetime "created_at",               null: false
    t.datetime "updated_at",               null: false
    t.string   "profile_img_file_name"
    t.string   "profile_img_content_type"
    t.integer  "profile_img_file_size"
    t.datetime "profile_img_updated_at"
    t.string   "banner_img_file_name"
    t.string   "banner_img_content_type"
    t.integer  "banner_img_file_size"
    t.datetime "banner_img_updated_at"
    t.integer  "user_id"
    t.string   "status"
    t.text     "bio"
    t.string   "relationship"
    t.text     "whitelist"
    t.text     "blacklist"
end

b_page.rb:

def self.search(query)
    where("Bpage_name like ?", "%#{query.downcase}%") 
end

1 个答案:

答案 0 :(得分:0)

标识符(例如表名和列名)在SQL中不区分大小写。但是,如果在创建表时双引号,则它们区分大小写。标准SQL将不带引号的标识符折叠为大写,但PostgreSQL将它们折叠为小写,因此当您说:

时,抱怨bpage_name是一个未知列
where("Bpage_name like ?", "%#{query.downcase}%")

ActiveRecord在创建表时双引用所有标识符,因此如果您有任何区分大小写的区分(例如Bpage_name),那么您必须在SQL代码段中使用它们时双重引用它们:

where('"Bpage_name" like ?', "%#{query.downcase}%")
# -----^----------^

PostgreSQL(以及Rails / ActiveRecord)的推荐做法是使用带下划线的小写列名来分隔单词。这样说:

t.string   "bpage_name"
迁移中的

将更符合这两种约定,并完全避免引用问题。

当你说出类似的话时:

where(:Bpage_name => 'pancakes')

ActiveRecord将自己添加引号并发送:

where "Bpage_name" = 'pancakes'

到数据库。引用和区分大小写问题仅在使用SQL时出现;当然,你几乎总是最终使用ActiveRecord的SQL片段,所以如果你不想用一堆嘈杂的双引号乱丢你的代码,命名约定仍然很重要。