Rails 3.0,希望在ActiveRecord模型中匹配'UK'=='United Kingdom'

时间:2010-08-03 10:39:44

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

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

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

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

但我必须在整个应用程序中执行此操作,这很糟糕。

所以问题是:我怎么能在Country模型中进行只搜索搜索的搜索。当它进行查询时,我不想要{:name => 'UK'}

例如。如果我搜索UK,则结果应为{:name => 'United Kingdom'} NOT {:name => 'UK'}

如果我可以把一些愚蠢的黑客放进去,那么解决方案是可以的:

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

2 个答案:

答案 0 :(得分: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等。

答案 1 :(得分:0)

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

字符串'UK'来自哪里?用户输入?

我会建议这个来源的位置,通过一个将'UK'转换为“United Kingdom”的公共过滤器(也许是一个application_helper方法)。