2011-02-08 48 views
2

這裏更紅寶石的方式是我的控制器索引操作是否有這樣做的邏輯

sub1 = "(select sum(courses_users.know) from courses_users where courses_users.course_id = courses.id) know_score" 
sub2 = "(select levels.name from levels where levels.id = courses.level_id) level_name" 
@courses = ActiveRecord::Base.connection.execute "select name,#{sub1},#{sub2} from courses order by level_id, know_score" 
@total_score = User.count() * 2; 

這就是視圖邏輯

<% level_name = "" %> 
<% @courses.each do |course| %> 
<% if course[2] != level_name %> 
    <tr> 
     <th colspan='2' style='text-align:left;'><br /><br /><%= course[2] %><br /><br /></th> 
    </tr> 
    <tr> 
    <th>Title</th> 
    <th>Knowledge Score</th> 
    </tr> 
    <% level_name = course[2] %> 
<% end %> 
<tr> 
    <td><%= course[0] %></td> 
    <td><%= (course[1].nil? ? 0 : course[1].to_i) %>/<%= @total_score %></td> 
</tr> 
<% end %> 

這是什麼每個淡然看起來像一個例子環

["PHP - The Basics", #<BigDecimal:1033708d0,'0.31E2',9(18)>, "Beginner"]---------------- 

這似乎是這樣的黑客,我很想讓這更類似於Ruby,

這裏是我的數據庫結構,如果他們將幫助

create_table "courses", :force => true do |t| 
    t.string "name" 
    t.integer "target_id" 
    t.integer "level_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "order_num" 
end 

create_table "levels", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

回答

2

我會做的第一件事情就是添加兩個作用域來從課程表中的相關計數:

 
class Course 
    has_many :courses_users 
    belongs_to :level 

    scope :with_know_score, joins(:courses_users).group("courses.id").select(["courses.*"," sum(courses_users.know) as know_score"]) 
    scope :with_level_name, joins(:level).select(["courses.*","levels.name as level_name"]) 
end 

然後,您可以簡化控制器代碼:

 
@courses = Course.with_know_score.with_level_name 
@total_score = User.count * 2 

而且你的視圖代碼:

 
<% level_name = "" %> 
<% @courses.each do |course| %> 
    <% if course.level_name != level_name %> 
    ... 
    <% level_name = course.level_name %> 
    <% end %> 
    <tr> 
    <td><%= course.name %></td> 
    <td> 
     <%= course.know_score || 0 %>/<%= @total_score %> 
    </td> 
    </tr> 
<% end %> 

在控制檯,你應該能夠鍵入:

 
c = Course.with_know_score.with_level_name.first 
c.name # 'PHP ...' 
c.level_name # 'Beginner' 
c.know_score # 
+0

似乎很大,但其未能對失蹤的屬性:名字......我認爲它不給我 – Trace

+0

我更新了我的範圍對象數據或某事這樣你也可以獲得課程名稱。 –

+0

我欣賞所有的幫助..再次感謝,但最後一個問題未定義的方法'know_score'爲#<課程:0x103490dc8> – Trace