我有一个模型 Location
,其字段 name
通常包含变音符号 - 例如“Rhône-Alpes”、“Midi-Pyrénées”和“Île-”去法国”。
此模型在我的应用程序中以几种不同的方式使用,特别是对于按名称进行的查询。示例包括:
Location.find_by(name: 'Rhône-Alpes')
Location.find_or_create_by(name: 'Rhône-Alpes', country: 'France')
这些 find
方法的参数因应用程序而异。我的问题是:如何确保每次引用名称字段时都会调用某个 Postgres 函数(在本例中为 unaccent()
)?这意味着我可以搜索“Rhone”和“Rhône”,并获得相同的结果。
是否最好覆盖 find_by
和 find_or_create_by
方法?如果是这样,最好的方法是什么?
最佳答案
将逻辑下推到数据库层总是好的,但如果你一直在处理许多不同的项目,你可能需要在未来执行一个不带 unaccenting 的查找,然后在你不能轻易找到时遇到问题调试,因此在执行此操作时必须始终小心。
不要覆盖 find_by 方法,不建议这样做,因为您可能会执行标准的 find_by 并产生无法预料的后果。
您是否考虑过在 find_by 之前清理输入?
>> ActiveSupport::Inflector.transliterate("Rhône-Alpes")
=> "Rhone-Alpes"
关于ruby-on-rails - rails 4 : Always use a Postgres function for a certain model field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27666213/