2012-10-04 2 views
0

У меня есть Project и Entry как модели. Проекты могут иметь много записей, а записи принадлежат только проекту. У записей есть даты.Рельсы 3 цепи и прицел

Один из требований к представлению данных состоит в том, чтобы показывать проекты, в которых есть записи для определенного месяца. Для достижения этой цели мне удалось использовать области, то есть Project.with_entries.on(param_the_month).

Проблема в том, что теперь я хочу отображать записи только за этот месяц, сгруппированные по проектам. Если я делаю projects.each do |p|, тогда запрос для записей (p.entries), возвращаемые записи относятся на все месяцы, а не только месяц, указанный мной.

Хотя это очевидный результат, есть ли способ в Rails просто вернуть записи за этот месяц, используя мою первоначальную цепочку?

ответ

1

has-many ассоциации также принимают области, поэтому вы можете сделать projects.entries.your_scope, чтобы отфильтровать их. Недостатком является то, что для каждого проекта потребуется другой запрос к базе данных, который может быть медленным в зависимости от размера вашей базы данных.

Альтернатива, которая не требует дополнительных запросов будет получать записи уже отфильтрованы, а затем идут вверх, чтобы получить проекты:

entries = Entry.my_conditions.includes(:project) 
entries_by_project = entries.group_by(&:project) 

Теперь у вас есть хэш, ключи являются проекты, и значения - это только записи этого проекта, которые передают ваши условия.

1

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

scope :my_scope, includes(:entries).where(:active => true) 
2

Edit: я сделал неправильно :)

Take 2: Вы можете объединить области по моделям. Так что, если вы можете создать область where -типа на Entry для выбора записей из данного месяца, вы можете попробовать что-то вроде

Project.with_entries.on(param_the_month).merge(Entry.on(param_the_month)) 

Я назвал его on по аналогии с рамкой на Project - не видя модель данных Я не могу сказать, как именно ее реализовать.

+0

. With_entries возвращает проекты, у которых есть записи, а «on» - в другой области для проектов. – RailinginDFW

+0

Пожелайте, чтобы вы ответили ранее, уже принято другое решение. – RailinginDFW

+0

Ну, если это решает проблему, то я не понял ее правильно :) Если в проекте есть две записи, одна из которых соответствует вашим условиям, а другая - нет, вы хотите, чтобы обе записи или только одна совпала? Я спрашиваю об этом, потому что вызов '# entries' при возврате из строки выше возвращает две записи. –

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