0

不确定是否有您知道的解决方法,但是在使用 globalize 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>]

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

只是为了好衡量

导轨 4.2.6 红宝石 2.3.0

4

2 回答 2

2

谢谢@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 表上加入的,所以可以通过使用 Globalize gem 附带的模型助手来实现,即:

 translates :name

所以然后我检查了翻译表,发现“午餐盒”一词不存在任何翻译,并且由于该属性name是全球化的,因此需要翻译。

添加翻译,问题解决。希望这对其他人有帮助。

于 2017-11-28T03:01:16.300 回答
0

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

更多信息 - SQL 注入:7.2.4 对策

于 2017-11-27T01:05:19.157 回答