Rails 3.0, хочу сопоставить «UK» == «United Kingdom» в модели ActiveRecord

У меня проблема, у меня модель Country. где запись в БД: {: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"

person pgericson    schedule 03.08.2010    source источник


Ответы (2)


Вы можете добавить метод поиска клиентов в свою модель 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

Существуют различные вариации вокруг этого. Я думаю, что предпочел бы второй пример, потому что он представляет тот же API, что и средства поиска на основе динамических атрибутов, которые предоставляет ActiveRecord, т.е. find_by_XXX и т. д.

person John Topley    schedule 03.08.2010
comment
можно ли сделать его общим, чтобы он работал для всех поисковых запросов, вызываемых с помощью where(:name => 'UK')? - person pgericson; 03.08.2010
comment
@ raus22 Я не верю, что это возможно без исправления самой ActiveRecord. - person John Topley; 03.08.2010
comment
Спасибо за ответ, я думаю, что я сделаю пользовательский метод Country.by_name - person pgericson; 04.08.2010

Я думаю, вы могли бы сделать это с помощью довольно неприятного исправления обезьяны метода ActiveRecord::Base.find, но я не думаю, что это хорошая идея.

Откуда взялась строка «Великобритания»? Пользовательский ввод?

Я бы посоветовал, где бы ни находился этот источник, пропустить его через общий фильтр (возможно, метод application_helper), который преобразует «Великобританию» в «Великобританию».

person DanSingerman    schedule 03.08.2010