Rails:活动记录查询条件仅在声明为 sql 时有效——使用 Globalize gem

Rails: Active record query conditions only work if stated as sql -- using Globalize gem

不确定是否有您知道的解决方法,但是在使用全球化时 gem

class Menu < ActiveRecord::Base

  translates :name
  # other stuff ... 

end 

如果我按照标准编写活动记录查询,它会生成一个空集。

-- 一般

Model.where(attribute: "Value")

不起作用,其中

Model.where('attribute = ?', 'Value')

有效。

--- 来自我的菜单模型控制台的真实示例:

2.3.0 (main):0 > Menu.where(name: "Lunch Boxes")
=> []
2.3.0 (main):0 > Menu.where('name = ?', "Lunch Boxes")
=> [#<Menu:0x007fbab6dc6838 id: 12, restaurant_id: 15, name: "Lunch Boxes", created_at: Wed, 05 Jul 2017 16:07:20 EDT -04:00, updated_at: Thu, 10 Aug 2017 14:48:38 EDT -04:00>]

谁能告诉我为什么会这样?

仅供参考

Rails 4.2.6 Ruby2.3.0

没关系。您正在尝试从 class 获取此数据,并且 rails 正在等待特殊字符的过滤器。

更多信息 - SQL Injection: 7.2.4 Countermeasures

谢谢@mu-is-too-short -- 不知道我自己要花多长时间才能弄明白。

弄清楚发生了什么的诀窍是转换为我正在比较的两个命令 sql 这样我就可以准确地看到正在尝试什么。

Menu.where(name: "Lunch Boxes").to_sql
Menu.where('name = ?', "Lunch Boxes").to_sql

这些制作,分别是:

=> "SELECT \"menus\".* FROM \"menus\" WHERE (name = 'Lunch Boxes')"

=> "SELECT \"menus\".* FROM \"menus\" INNER JOIN \"menu_translations\" 
  ON \"menu_translations\".\"menu_id\" = \"menus\".\"id\" WHERE 
  \"menu_translations\".\"name\" = 'Lunch Boxes' AND 
  \"menu_translations\".\"locale\" = 'fr'"

然后我 运行 直接在 psql 控制台中查询,然后返回一个空集。因为它是在 menu_translations table 上加入的,所以可以通过使用 Globalize gem 附带的模型助手实现,即:

 translates :name

然后我检查了 t运行slation table,发现术语 "Lunch Boxes" 不存在于任何 t运行slation,并且因为属性 name 是全球化的,它需要一个 t运行slation。

添加了t运行slation,问题解决了。希望这可以帮助别人。