【问题标题】:Rails 3.0, want to match 'UK' == 'United Kingdom' in ActiveRecord modelRails 3.0,想在 ActiveRecord 模型中匹配 'UK' == 'United Kingdom'
【发布时间】:2010-08-03 10:39:44
【问题描述】:

我有问题, 我有一个国家模型。数据库中的条目是:{:name => 'United Kingdom'}

我的数据是UK,而不是United Kingdom。在我搜索过的其他模型中:

country_name = "United Kingdom" if country.name == "UK"

但我必须在整个应用程序中都这样做,这很糟糕。

所以问题是:我如何才能在Country 模型中进行仅用于搜索的搜索。当它进行查询时,我不想要{:name => 'UK'}

例如。如果我搜索UK,结果应该是{:name => 'United Kingdom'} 而不是{:name => 'UK'}

如果我可以加入一些愚蠢的黑客,解决方案就可以了:

name = "United Kingdom" if searchstring == "UK"

【问题讨论】:

    标签: ruby-on-rails activerecord find attributes custom-attribute


    【解决方案1】:

    您可以将客户查找器方法添加到您的 Country 模型:

    class Country < ActiveRecord::Base
      def self.by_name(name)
        name == 'UK'? find_by_name('United Kingdom') : find_by_name(name)
      end
    end
    

    然后,您可以在需要通过名称查找国家/地区时使用Country.by_name('...')。或者,如果您想保留 find_by_name 方法的语义:

    class Country < ActiveRecord::Base
      def self.find_by_name(name)
        name = 'United Kingdom' if name == 'UK'
        where(:name => name)
      end
    end
    

    这方面有各种变化。我想我更喜欢第二个示例,因为它提供了与 ActiveRecord 提供的基于动态属性的查找器相同的 API,即 find_by_XXX 等。

    【讨论】:

    • 是否可以使其通用,因此对于使用where(:name =&gt; 'UK') 调用的所有搜索都可以使用?
    • @raus22 我不相信没有猴子补丁 ActiveRecord 本身是可能的。
    • 感谢您的回答,我认为自定义 Country.by_name 方法不好
    【解决方案2】:

    我认为您可以通过对 ActiveRecord::Base.find 方法进行一些相当讨厌的猴子修补来做到这一点,但我认为这不是一个好主意。

    字符串“UK”从何而来?用户输入?

    我建议无论该来源在哪里,都通过一个通用过滤器(可能是 application_helper 方法)将“UK”转换为“United Kingdom”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多