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 正在等待特殊字符的过滤器。
谢谢@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,问题解决了。希望这可以帮助别人。
不确定是否有您知道的解决方法,但是在使用全球化时 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 正在等待特殊字符的过滤器。
谢谢@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,问题解决了。希望这可以帮助别人。