【问题标题】:Rails: Active record query conditions only work if stated as sql -- using Globalize gemRails:活动记录查询条件仅在以 sql 形式表示时才有效——使用 Globalize gem
【发布时间】:2017-11-26 23:59:08
【问题描述】:

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

【问题讨论】:

  • 我不知道 globalize 在你背后做什么,但比较 Model.where(attribute: "Value").to_sqlModel.where('attribute = ?', 'Value').to_sql 可能会有所启发。查看原始表数据(即没有任何 ActiveRecord 干扰)也可能很有启发性。
  • 你真是个天才。呜呜。通过快速查看您对 to_sql 的建议,很明显,如果翻译表中缺少翻译,则模型(具有在查找期间需要翻译的属性)返回 nil - 因此集合为空。挫败了我自己的应用程序(显然按设计运行)。谢谢
  • 可能值得将该评论转换为答案。当事情不能“正常工作”时,所有的魔法都会非常令人费解。

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord globalize


【解决方案1】:

感谢@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是全球化的,所以需要翻译。

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

【讨论】:

    【解决方案2】:

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

    更多信息 - SQL Injection: 7.2.4 Countermeasures

    【讨论】:

    • 嗯?你可能误会了。你让我阅读的文档部分说“或者你可以为相同的结果传递一个哈希”——我只是想传递一个哈希,得到一个空的结果,而不是我得到的记录使用 SQL 片段。两者都是有效的陈述,为什么哈希版本不起作用?这是我的问题。
    • @trh 看起来一个人永远不会有足够的安全性:) 但我明白你的意思。你在 rails v.5+ 上试过这个吗?
    • 不,我被困在这个应用程序的 rails 4 中。呜呜呜呜呜呜呜。
    • @trh 接受我的哀悼。我在 5.1.4 上试过这个,两个查询都很好。好吧,我想这就是我们的答案。
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2012-03-20
    • 2013-02-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多