【问题标题】:Heroku PG::UndefinedColumn: ERROR does not existHeroku PG::UndefinedColumn: 错误不存在
【发布时间】:2016-11-10 15:49:58
【问题描述】:

这在 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

【问题讨论】:

  • 你能显示查询字符串的样子吗?
  • 您进行了迁移吗?

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


【解决方案1】:

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

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

ActiveRecord 在创建表时将所有标识符都用双引号引起来,因此如果您有任何区分大小写的列名(例如 Bpage_name),那么您必须在 SQL sn-ps 中使用它们的任何地方将它们双引号:

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

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

t.string   "bpage_name"

在您的迁移中会更符合这两种约定,并且会完全避免您的引用问题。

当你说这样的话:

where(:Bpage_name => 'pancakes')

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

where "Bpage_name" = 'pancakes'

到数据库。引用和区分大小写的问题仅在您使用一些 SQL 时出现;当然,您几乎总是最终将 SQL sn-ps 与 ActiveRecord 一起使用,因此如果您不想在代码中乱扔一堆嘈杂的双引号,那么命名约定仍然很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 2013-12-15
    • 2015-07-18
    • 2016-06-01
    • 2020-01-16
    • 2016-07-11
    • 2017-06-18
    • 2022-11-28
    相关资源
    最近更新 更多