我有Project
和Entry
作为模型。项目可以有许多条目,条目只属于项目。参赛作品有日期。
一个报告要求是显示具有特定月份的条目的项目。我已经成功地使用范围来实现这一目标,即Project.with_entries.on(param_the_month)
。
问题是我现在只想显示那个月的条目,按项目分组。
如果我执行projects.each do |p|
,然后查询条目(p.entries
),则返回的条目适用于所有月份,而不仅仅是我指定的月份。
虽然这是一个明显的结果,但是Rails有没有办法使用我原来的链式范围简单地返回该月的条目?
答案 0 :(得分:2)
编辑:我确实误解了:)
拍摄2:您可以跨模型合并范围。因此,如果您可以在where
上创建Entry
类型范围来选择指定月份的条目,则可以尝试类似
Project.with_entries.on(param_the_month).merge(Entry.on(param_the_month))
我在on
上与你的作品类似地称之为Project
- 没有看到你的数据模型我就不知道如何实现它。
答案 1 :(得分:1)
has-many
个关联也接受范围,因此您可以projects.entries.your_scope
来过滤它们。缺点是这将需要为每个项目进行另一个数据库查询,这可能会很慢,具体取决于数据库的大小。
不需要额外查询的替代方法是获取已经过滤的条目,然后向上移动以获取项目:
entries = Entry.my_conditions.includes(:project)
entries_by_project = entries.group_by(&:project)
现在你有一个哈希,其键是项目,而值只是那个通过你条件的项目的条目。
答案 2 :(得分:1)
您可以在您的范围中添加包含,这样它就不会再次查询这些记录,当您使用项目范围时,它会急切地加载它们。
scope :my_scope, includes(:entries).where( :active => true )