Лучшие практики фильтрации рельсов - PullRequest
0 голосов
/ 22 августа 2011

У меня есть веб-приложение со следующими моделями: Смены, Годы, Оформление заказа, Продажи и Посетители.

Сдвиг has_many Оформление заказа, Продажи, Посетители Год has_many Сдвиги

Оформление заказа,Продажи и посетители принадлежат к сменным сменам принадлежат к году

В моем приложении я хочу, чтобы присутствовало много разных лет, хотя в любой момент времени активен только ОДИН.Например, при отображении сдвигов я хочу, чтобы отображались только сдвиги за активный год.Это достаточно просто.

С чем мне действительно тяжело работать - это написать запрос, чтобы получить все платежи за активный год.Есть ли простой способ сделать это?Активный год фактически устанавливается в переменной сеанса, называемой session [: current_year_id].Я думал, что лучший способ сделать это - сделать что-то вроде:

@checkouts = Shift.where('year_id = ?',session[:current_year_id]).checkouts

Но это не работает для меня.Что мне нужно изменить, чтобы заставить это работать?

Обратите внимание, что оформление заказа, продажи и посетители НЕ имеют своего собственного year_id.У них есть год_ид через смену, к которой они относятся.

Решено:

Я проголосовал за все ответы, поскольку все помогли.Я использовал лямбда-выражение for_year.Я проголосовал за все ответы.

Окончательный ответ должен был использовать:

Shift.for_year(session[:current_year_id]).collect{ |shift| shift.checkouts } 

Ответы [ 3 ]

2 голосов
/ 22 августа 2011

Вы можете создать область в модели Shift, которая принимает текущий год в качестве параметра:

class Shift < ActiveRecord::Base
   has_many :checkouts
   scope :for_year, lambda { |current_year_id| where('year_id = ?', current_year_id) }
end

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

Shift.for_year(session[:current_year_id]).map(&:checkouts)
1 голос
/ 22 августа 2011

Использование .where возвращает отношение, поэтому есть два возможных ответа в зависимости от вашего намерения.

Если вы хотите найти кассы, относящиеся к первой смене, выполните:

@checkouts = Shift.where('year_id = ?',session[:current_year_id]).first.checkouts

Если вы хотите все оформить заказ на все смены, сделайте:

@checkouts = Shift.where('year_id = ?',session[:current_year_id]).collect{|shift| shift.checkouts}
1 голос
/ 22 августа 2011

Вы можете попробовать:

Shift.find_all_by_year_id(session[:current_year_id]) 

Предполагается, что current_year_id находится в сеансе.

У меня были проблемы с использованием .where, которые я исправил с помощью динамического поиска.

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