通过关联获取数据

时间:2013-11-12 18:29:15

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

表:

User

Project has_many Results

Project has_many Data through ProjectData

Results belongs_to data, project

Result表中,我有一个类型为int的列:position

所以我希望results的所有内容都level < 50,实际上是count的值。

我在考虑添加Result类

 def get_top_level current_user
   tsum = []
   Project.where(user_id: current_user).each do |project|
     tsum << project.results.where("level <= ?", 50).count
   end
   return sum(tsum)
 end

这样可行,但我觉得应该有一种简单而漂亮的方法。

可以在视图中使用类名并传递不同的值,例如:

<%=Results.get_top_level(current_user)%>

或者

<%=@results.get_top_level(current_user)%>

如果这些都不是一个好的做法,你能帮助我找到替代解决方案。

谢谢。

1 个答案:

答案 0 :(得分:1)

我会在项目模型上创建一个像这样的方法。

def get_top_level
  self.results.select{ |result| result.level <= 50 }
end

在用户模型上。这里有什么关系,用户有很多项目吗?或者只是一个项目。

def get_top_level 
  self.top_level_projects.inject(:+)
end

def top_level_projects
  self.projects.map(&:get_top_level)
end

现在调用current_user.get_top_level时 这将找到top_level_projects,映射关联的结果并将它们全部添加在一起。

相关问题