2012-10-04 77 views
0

我有ProjectEntry作为模型。项目可以有多个条目,并且条目仅属于一个项目。条目有日期。导轨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

您可以将include添加到您的作用域中,这样它不会再次查询这些记录,它会在您使用项目作用域时急切地加载它们。

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

编辑:我没有误会:)

以2:您可以在模型合并范围。所以,如果你可以创建一个Entrywhere范围选择从某一个月的条目,然后你可以尝试这样

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

我通过类比示波器称之为onProject - 没有看到你数据模型我不能说如何实现它。

+0

的with_entries返回具有条目,以及“关于”项目是另一个范畴的项目 – RailinginDFW

+0

祝你刚才回答,已经接受了另一个解决方案 – RailinginDFW

+0

好了,如果这个问题解决了,那么我没有理解正确的话:)如果一个项目有两个条目,一个符合您的条件,一个不符合条件,您希望两个条目或仅匹配一个条目?我问这是因为在上面一行的返回中调用'#entries'会返回两个条目。 –