ActiveRecord'其中'查询不适用于postgresql

时间:2017-01-03 16:04:44

标签: ruby-on-rails postgresql activerecord

我是activerecord和postgresql的新手,我对于activerecord查询有以下问题。请帮助我理解为什么会这样,以及我如何解决它。

我有多个文本列,在我的架构文件中以标准方式声明。

create_table "time_entries", force: :cascade do |t|
  t.string   "user"
  t.string   "email"    
  etc ....
end

我试图用'用户' ='测试'。

TimeEntry.where(user: "Test")

工作正常,但是

TimeEntry.where("user = 'Test'") 

不起作用。

我可以看到这两个查询产生了不同的sql查询,但我试图理解为什么这适用于'电子邮件'字段,但不是用户'字段。

用户字段查询:

irb(main):011:0> TimeEntry.where(user: "Test")
  TimeEntry Load (0.5ms)  SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."user" = $1  [["user", "Test"]]
=> #<ActiveRecord::Relation [#<TimeEntry id: 1, user: "Test", email: "test@testemail.com", task: nil, description: "TEST CRM", billable: "No", start_date: "2016-01-03", start_time: "2000-01-01 14:20:22", end_date: "2016-01-03", end_time: "2000-01-01 14:26:29", duration: "2000-01-01 00:06:07", tags: nil, amount: 111, created_at: "2017-01-03 15:39:51", updated_at: "2017-01-03 15:39:51", project_id: 1, resource_id: nil>]>

irb(main):012:0> TimeEntry.where("user = 'Test'")
  TimeEntry Load (0.4ms)  SELECT "time_entries".* FROM "time_entries" WHERE (user = 'Test')
=> #<ActiveRecord::Relation []>
irb(main):013:0> 

电子邮件字段查询:

irb(main):013:0> TimeEntry.where(email: "test@testemail.com")
  TimeEntry Load (0.3ms)  SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."email" = $1  [["email", "test@testemail.com"]]
=> #<ActiveRecord::Relation [#<TimeEntry id: 1, user: "Test", email: "test@testemail.com", task: nil, description: "TEST CRM", billable: "No", start_date: "2016-01-03", start_time: "2000-01-01 14:20:22", end_date: "2016-01-03", end_time: "2000-01-01 14:26:29", duration: "2000-01-01 00:06:07", tags: nil, amount: 111, created_at: "2017-01-03 15:39:51", updated_at: "2017-01-03 15:39:51", project_id: 1, resource_id: nil>]>

irb(main):014:0> TimeEntry.where("email = 'test@testemail.com'")
  TimeEntry Load (0.4ms)  SELECT "time_entries".* FROM "time_entries" WHERE (email = 'test@testemail.com')
=> #<ActiveRecord::Relation [#<TimeEntry id: 1, user: "Test", email: "test@testemail.com", task: nil, description: "TEST CRM", billable: "No", start_date: "2016-01-03", start_time: "2000-01-01 14:20:22", end_date: "2016-01-03", end_time: "2000-01-01 14:26:29", duration: "2000-01-01 00:06:07", tags: nil, amount: 111, created_at: "2017-01-03 15:39:51", updated_at: "2017-01-03 15:39:51", project_id: 1, resource_id: nil>]>

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好的,似乎是因为'user'是postgres中的保留关键字而出现此问题。

以下代码可以正常使用:

TimeEntry.where('time_entries.user = ?', 'Test')

TimeEntry.where('"user" = ?','Test')