Есть ли более рубиновый способ сделать эту логику - PullRequest
2 голосов
/ 08 февраля 2011

Вот мой указатель действия контроллера

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 %>

это пример того, как выглядит каждый couse в цикле

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

это похоже на такой хак, и я бы хотел сделать его более рубиновым как

вот моя структура БД, если это поможет

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

1 Ответ

2 голосов
/ 08 февраля 2011

Первое, что я хотел бы сделать, это добавить две области, чтобы получить соответствующие счетчики из таблицы курсов:

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 # 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...