2009-05-22 3 views
2

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

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

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

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

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

ответ

2

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

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

Может быть, это функция, которую Вы хотите посмотреть в?

1

Не знаю, если изменения 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 

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

+0

Спасибо Fer. Вы хорошо это понимаете. Я думал, могу ли я вообще избежать отфильтрованных данных из БД, добавив запрос в фильтр. Я справился с этим для искателей, исправляя AR с помощью with_scope. Но все же решать вопросы, возникающие для ассоциаций. – 2009-05-26 06:28:52

+0

Я избегаю связанных с ассоциацией запросов с включенными, НО есть ловушка, если ваша БД локальна, более мелкие (индексированные) запросы могут быть лучше одного большого (в случае с объединениями), если он удален, тем меньше сетевых соединений с ваш db тем лучше. Надеюсь, что это поможет вам, но, как всегда: сравнивайте свои решения, прежде чем выбирать! – Oinak

Смежные вопросы