1

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

我拥有的数据UK不是United Kingdom. 在我搜索它的其他模型中,我已经完成了:

country_name = "United Kingdom" 如果 country.name == "UK"

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

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

例如。如果我搜索UK并且结果应该是{:name => 'United Kingdom'}NOT {:name => 'UK'}

如果我可以放入一些愚蠢的hack,那么解决方案就可以了:

name = "United Kingdom" 如果搜索字符串 == "UK"
4

2 回答 2

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等。

于 2010-08-03T11:10:49.233 回答
0

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

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

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

于 2010-08-03T11:24:20.063 回答