Rails дизайн / кодирование - PullRequest
2 голосов
/ 22 мая 2009

У нас есть веб-приложение, которое обслуживает типичный социальный контент (блоги / форумы / потоки и т. Д.).

Весь контент может быть помечен городом. То есть если сообщение в блоге относится только к Нью-Йорку, оно будет помечено так.

Задача состоит в том, чтобы отображать только информацию о городе (по всему сайту), если пользователь установил предпочтения вида на город, и показывать все остальным.

Итак, я должен добавить 'и город == current_city', если city_specifc_view? для всех моих искателей во всех моих модельных классах, которые являются кобылой на техническое обслуживание (особенно с учетом риска изменения этой логики).

Мне интересно, как правильно применять эту логику. Могу ли я сделать это в центральном месте (например, переопределить поиск по умолчанию) вместо if / else во всех моделях. Обезьяна исправления ActiveRecord вариант?

Ответы [ 2 ]

2 голосов
/ 22 мая 2009

В ActiveRecord :: Base есть функция, называемая областями действия. Запрос, выданный в определенной области, будет объединен с опциями поиска этой области, т.е.

  class Person < ActiveRecord::Base
    default_scope :order => 'last_name, first_name'
  end

Может быть, это функция, которую вы хотите изучить?

1 голос
/ 22 мая 2009

Не знаю, подходит ли вам модификация AR.find, но у меня это сработало:

class Content < AR::base
  def self.find(*args)
    if logged_user.preferred_city
      choose_city(super(*args))
    else
      super(*args)
    end
  end
protected #to be inherited by content subtypes (post, pic, stream...)
  def self.choose_city(target) 
    case target
      when Array target.select{|t| choose_city(t)}
      when Person (target.city == logged_user.preferred_city ? target : nil)
      else target
    end
  end
end

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...