0

我有ProjectEntry作为模型。项目可以有很多条目,而条目只属于一个项目。条目有日期。

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

问题是我现在只想显示该月的条目,按项目分组。如果我这样做projects.each do |p|,则查询条目 ( p.entries),返回的条目是所有月份的,而不仅仅是我指定的月份。

虽然这是一个明显的结果,但 Rails 中有没有一种方法可以使用我原来的链式作用域简单地返回该月的条目?

4

3 回答 3

2

编辑:我确实误解了:)

采取 2:您可以跨模型合并范围。因此,如果您可以创建一个where-type 范围Entry以从给定月份中选择条目,那么您可以尝试类似

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

我已经on通过与您的范围类比来称呼它Project-没有看到您的数据模型,我无法确切地说明如何实现它。

于 2012-10-04T19:52:45.313 回答
1

has-many关联也接受范围,因此您可以projects.entries.your_scope过滤它们。缺点是这将需要对每个项目进行另一个数据库查询,这可能会很慢,具体取决于数据库的大小。

另一种不需要额外查询的方法是获取已过滤的条目,然后向上获取项目:

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

现在您有一个哈希,其键是项目,而值只是该项目中通过您的条件的条目。

于 2012-10-04T19:51:14.710 回答
1

您可以将包含添加到您的范围中,这样它就不会再次查询这些记录,它会在您使用项目范围时立即加载它们。

scope :my_scope, includes(:entries).where( :active => true )
于 2012-10-04T19:51:34.383 回答