Rails 3链接关联和范围

时间:2012-10-04 19:46:13

标签: ruby-on-rails ruby activerecord

我有ProjectEntry作为模型。项目可以有许多条目,条目只属于项目。参赛作品有日期。

一个报告要求是显示具有特定月份的条目的项目。我已经成功地使用范围来实现这一目标,即Project.with_entries.on(param_the_month)

问题是我现在只想显示那个月的条目,按项目分组。 如果我执行projects.each do |p|,然后查询条目(p.entries),则返回的条目适用于所有月份,而不仅仅是我指定的月份。

虽然这是一个明显的结果,但是Rails有没有办法使用我原来的链式范围简单地返回该月的条目?

3 个答案:

答案 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 )