如果我的标题有点令人困惑,我道歉...我不确定如何用它来表达它。
现在我有一个“运动”模型,其中有一个“muscle_group”列,可能的值为“Abdominals”,“Arms”,“Back”,“Chest”等。 我想使用ActiveRecord能够通过muscle_group将每一行分组为一个实例变量。
我目前有:
@abdominals = Exercise.where(:muscle_group => "Abdominals")
@arms = Exercise.where(:muscle_group => "Arms")
@back = Exercise.where(:muscle_group => "Back")
@chest = Exercise.where(:muscle_group => "Chest")
@legs = Exercise.where(:muscle_group => "Legs")
@shoulders = Exercise.where(:muscle_group => "Shoulders")
@ALL_EXERCISES = [@abdominals, @arms, @back, @chest, @legs, @shoulders]
在我的控制器中。然而,这似乎不够干,感觉我可以做得更好。
我还有一个名为“Ex_Sets”的模型,属于“运动”,作为回报“has_many”“Ex_sets”。在我看来,我有:
-@ALL_EXERCISES.each do |mgroup|
-if mgroup.present?
%h2
#{mgroup.first.muscle_group}
-mgroup.each do |exercise|
%p
%h5
#{exercise.name}
%h6
- exercise.ex_sets.each do |data|
%p
Sets: #{data.sets}
Reps: #{data.reps}
Weight: #{data.weight} lbs
迭代我之前创建的@ALL_EXERCISES数组,然后遍历每个特定的肌肉群,然后再次迭代以获得所有“Ex_Set”数据。这似乎不太理想,但我不确定如何改进,因为我从未做过太多优化。
我的问题:
1)我怎样才能干掉我的代码?
2)我怎样才能优化它而不是3个循环(我认为是O(n ^ 3)?)
答案 0 :(得分:1)
结束了解决问题...对于任何可能感兴趣的人:
@all_exercises = Exercise.all.includes(:ex_sets).group_by(&:muscle_group)
干掉我的代码。
includes(:ex_sets)
使用预先加载来避免不必要的查询。 至于优化我的视图,显然3个嵌套for循环不一定意味着O(n ^ 3)运行时。它运行在O(n)中,我被告知我无法做很多事情来优化其算法效率。但是,我可以使用集合部分来清理我的代码:
答案 1 :(得分:0)
首先,您可以使用分组http://guides.rubyonrails.org/active_record_querying.html#group
来干燥控制器代码