Rails如何在实例变量之后订购

时间:2011-04-11 19:01:52

标签: ruby-on-rails ruby ruby-on-rails-3

在我的konkurrancerstable中,我有:

rating_score => The current score (integer)
ratings => The number of ratings which led to the score (integer)

在我看来,我想在评级后对konkurrancers进行排序。 所以我必须做这个数学:rating_score / ratings 评级可能不为空,因为我不能将其除以零。

<% @konkurrencer.find(:all, :order => '@rating ASC', :limit => 5).each do |vind| %>
  <%= link_to(image_tag(vind.banner2, :style => 'border:none; width:125px; height:125px;'), vind.tracking, :target => '_blank')  %>
<% end %>

我的控制器:

class PublicController < ApplicationController
  helper_method :sort_column, :sort_direction
  def index 
    @konkurrencer = Konkurrancer
  end
end

我的观点:

15: <%= @konkurrencer.find(:all, :select => "rating_score/ratings AS rating", :order => 'rating ASC', :limit => 5).each do |da| %>
16: <%= da.banner2 %>
17: <% end %>

我得到以下错误:

ActiveModel::MissingAttributeError in Public#index Showing C:/Rails/konkurranceportalen/app/views/public/_konkurrencer.html.erb where line #16 raised: missing attribute: banner2

如何创建实例变量评级以订购konkurrancers?

2 个答案:

答案 0 :(得分:3)

如果没有别的,您可以在从数据库中检索记录后,按照两个标准对记录列表进行排序。

在控制器的index方法中,我会这样做:

@konkurrancers = Konkurrancer.find(:all, :order => '@rating ASC')
@konkurrancers.sort! {|a, b|
  rel = a.rating_score <=> b.rating_score
  # if "rating_scores" are equivalent, only then consider "ratings"
  rel == 0 ? a.ratings <=> b.ratings : rel
}

这将为您提供所有Konkurrencer对象的列表,按两个条件排序。

在您看来,我会这样做:

<% @konkurrancers[0,5].each do |vind| %>
   <%= link_to(image_tag(vind.banner2, :style => 'border:none; width:125px; height:125px;'), vind.tracking, :target => '_blank')  %>
<% end %

这应该只为您在控制器中创建的列表中的前5个项创建html。 (这是你想要的吗?)

答案 1 :(得分:0)

如果您使用的是SQL,则可以使用

@konkurrencer.find(:all, :select => "rating_score/ratings AS rating", :order => 'rating ASC', :limit => 5)

class Konkurrencer
  def rating
    self[:rating] || (rating_score/rating)
  end
end

rshallit链接到一篇关于上述内容的好文章。但是它在Rails 3中,看起来你正在使用Rails&lt; 3