Умная фильтрация с помощью Rails ActiveRecord - PullRequest
1 голос
/ 21 февраля 2011

Допустим, у меня есть модель AR Foo

Foo.find методы будут возвращать все записи из таблицы foo на основе критериев. Мне нужно иметь какие-то критерии по умолчанию, такие как столбец страны, чтобы, если я определю это каким-либо образом в AR , все мои Foo.find методы будут возвращать записи только из этой страны ...

Как я могу сказать AR использовать такое поведение по умолчанию или установить его динамически?

1 Ответ

1 голос
/ 21 февраля 2011

Ну, я думаю, вы говорите о переопределении функции поиска, которая, вероятно, не так безопасна, но выполнима.Вы также столкнетесь с проблемами поддержки различных форматов поиска.Например, как вы будете обрабатывать Foo.find (1) и Foo.find ([1,2,3])?Чтобы сделать это безопасным способом, вы должны действительно использовать прицелы.Например, в Rails 3 вы должны сделать следующее:

class Foo
  scope :country, lambda{ |country| where(country: country) }
end

Затем вы можете использовать эту область всякий раз, когда выполняете вызов для запроса Foo.Например:

Foo.country('United States').where(...).all

Если вы хотите еще больше упростить этот код, потому что вы часто его используете, вы можете создать функцию на Foo, чтобы справиться и с этим:

class Foo
  def self.with_country
    country(current_selected_country)
  end
end

Чтобы вы могли выполнять вызовы find следующим образом:

Food.with_country.all

Используя этот метод, вы избегаете необходимости переопределять функциональность ActiveRecord по умолчанию, так что ваш код будет проще для понимания другими разработчиками, и вам не придется беспокоитьсяо поддержке множества различных форматов методов и вызовов.

Если вы хотите, чтобы это было вашим поведением по умолчанию, вы можете использовать ActiveRecord default_scope следующим образом:

class Foo
  default_scope where(country: 'United States')
end

Это будет примененопри создании записи, но не при обновлении записи.

...