如何在Rails中使用外部方法进行排序?

时间:2015-08-29 21:57:08

标签: ruby-on-rails

所以,我正在制作一个Items课程,而人们会在评论中包含评分的评论和项目模型中写评论,我写了一个定义的方法,称为' average_rating'通过收集与此项目对应的评论中的所有评级来计算项目的平均评级。 现在我想通过使用这个函数对项目进行排序,但我发现它是一个未定义的函数。 项目型号:

  class Item < ActiveRecord::Base
        has_many :reviews, dependent: :destroy
        belongs_to :category
      def average_rating
        if self.reviews.size > 0
           sprintf('%.2f', self.reviews.average(:rating)) 
        else
            'undefined'
        end
    end
     def self.search(query)
        where("name like ?", "%#{query}%") 
      end
      def self.top(query)
       text= Category.where(name: query).first
      where("category_id like ?", "%#{text.id}%")
    end
    end

项目视图:

<%  @items=@items.sort_by{|x,y| x.average_rating <=> y.average_rating } %>
<% @items.each do |item| %>
  <div class="item">
    <h4>
    <%= link_to item.name, item %>
</h4>
   <ul>
    <li><%= item.description %></li>
    <li> <%= item.average_rating %> </li>
</ul>
  </div>
<% end %>

错误: 未定义的方法`average_rating&#39;为零:NilClass

2 个答案:

答案 0 :(得分:0)

您收到该错误的原因是item部分nillocal_items = @items.compact.sort_by{|x,y| x.average_rating <=> y.average_rating } 。你可以这样做,先删除空白/零值,然后对它们进行排序:

local_items = @items.reject { |c| c.blank? }.sort_by{|x,y| x.average_rating <=> y.average_rating }

,或者

local_items

更新

尝试在视图中将局部变量重命名为local_items = @items.compact.sort_by{|x,y| x.average_rating <=> y.average_rating } ,然后循环显示:

<% local_items.each do |item| %>
  <div class="item">
    <h4>
    <%= link_to item.name, item %>
</h4>
   <ul>
    <li><%= item.description %></li>
    <li> <%= item.average_rating %> </li>
</ul>
  </div>
<% end %>

然后:

require 'savon'

c = Savon.client(endpoint: "http://www.example.com",
                 namespace: "urn:ns.example.com",
                 log: true,
                 log_level: :debug,
                 pretty_print_xml: true)

r = c.call(:call,
           :message => { 
                  :InquiryParam => [ 
                         {"crmParam" => 123,
                        :attributes! => { "crmParam" => { "name" => "AccountNumber" }}},
                         {"crmParam" => 456,
                        :attributes! => { "crmParam" => { "name" => "history" }}}
                        ]
                  }

答案 1 :(得分:0)

当您在上调用方法的对象为nil时,会出现此类错误。

我猜您的@items列表中有一个nil - 您可以通过调用@items.compact

获取已移除所有{{1}}的数组副本