Rails 3.0, хотите соответствовать 'UK' == 'United Kingdom' в модели ActiveRecord - PullRequest
1 голос
/ 03 августа 2010

У меня проблема, у меня есть модель 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"

Ответы [ 2 ]

1 голос
/ 03 августа 2010

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

0 голосов
/ 03 августа 2010

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

Где находится строка 'UK'родом из?Пользовательский ввод?

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

...