2013-07-02 1 views
0

Я делаю страницу поиска для своей службы, и она включает в себя несколько параметров поиска, основанных на ассоциации, я могу придумать несколько беспорядочных SQL-запросов, но предпочел бы некоторые уборщик подходы, в качестве образца,Запросы Rails, которые состоят из подсчетов по ассоциациям, желательно с областями

class Person < ActiveRecord::Base 
    has_many :friends 
end 

Друг имеет атрибут, который указывает на состояние дружбы, то вроде friend_type

class Friend < ActiveRecord::Base 
    belongs_to :person 
end 

форма поиска будет состоять из многих параметров, два из них поиск людей, которые имеют больше, чем ac определенное количество друзей, и сколько людей имеют друзей, у которых есть функция friend_type, например «bff».

То, что я хотел бы сделать, это есть некоторые методы, области применения в модели, и в контроллере быть в состоянии сделать это,

некоторые модели прицелы в лицо, как это,

scope :by_friends_count_greater_than, lambda { |value| joins(:friends).where(#count friends#, value) if value } 
scope :by_bff_count_greater_than, lambda { |value| joins(:friends).where(##count friends with bff status## , value) if value } 

и вызов их в контроллере, как это так,

@people = Person.by_friends_count_greater_than(params[:query][:friends_count]) 
       .by_bff_count_greater_than(params[:query][:bff_count]) 

Я пытался из squeel, который, кажется, очень хороший актив, учитывая, что может вызвать методы в запросе. Возможно ли, чтобы поисковые запросы выполнялись таким образом?

Если есть лучший способ приблизиться к этому, это было бы очень оценено.

ответ

0

Возможно, вас заинтересовал counter_cache, чтобы иметь более простые запросы.

Он автоматически увеличит счетчик для каждой модели Person.

http://railscasts.com/episodes/23-counter-cache-column

Вы должны добавить friends_count столбец в модели Person

и указать counter_cache на belongs_to

class Friend < ActiveRecord::Base 
    belongs_to :person, counter_cache: true 
end 
+0

Это способ, которым я не думал о том, спасибо за совет. Это будет работать с подсчетом обычных друзей, но это не сработает для подсчета друзей с определенными атрибутами, установленными для них, если я правильно понимаю кеширование счетчиков. – Saifis

+0

Нет, но способ работы счетчиков кешей может быть ручной работы для эффективных запросов. Если нужно – yannick