将实例变量初始化为特定的列属性

时间:2014-03-16 17:15:32

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

如果我的标题有点令人困惑,我道歉...我不确定如何用它来表达它。

现在我有一个“运动”模型,其中有一个“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)?)

2 个答案:

答案 0 :(得分:1)

结束了解决问题...对于任何可能感兴趣的人:

@all_exercises = Exercise.all.includes(:ex_sets).group_by(&:muscle_group)

干掉我的代码。

includes(:ex_sets) 

使用预先加载来避免不必要的查询。 至于优化我的视图,显然3个嵌套for循环不一定意味着O(n ^ 3)运行时。它运行在O(n)中,我被告知我无法做很多事情来优化其算法效率。但是,我可以使用集合部分来清理我的代码:

http://robots.thoughtbot.com/rendering-collections-in-rails

答案 1 :(得分:0)

首先,您可以使用分组http://guides.rubyonrails.org/active_record_querying.html#group

来干燥控制器代码