这在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
答案 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片段,所以如果你不想用一堆嘈杂的双引号乱丢你的代码,命名约定仍然很重要。