在显示(html)页面中,我有这个
<% if @movie.views_count > 150 && @movie.ratings_chart_last_days(30) < 4 %>
You are in the first 3 positions
<% end %>
在movie.rb中,我有这个
def ratings_chart_last_days(number_of_days)
subset = Movie.where('movies.created_at >= ?', number_of_days.days.ago)
@ratings_chart_last_days ||= chart_position(:ratings_abs, subset)
end
但是我有这份报告:
nil:NilClass的未定义方法“ <”
ratings_chart_last_days方法返回nil。然后,当它尝试进行<比较时,它将尝试执行<方法。 NilClass不支持该方法。
如何解决?!
编辑
图表位置代码
module Chartable
def chart_position(attribute, start_query = nil)
attribute = self.class.connection.quote_column_name(attribute.to_s)
partition = partition_by(start_query || self.class.all, attribute)
self.class.from(partition, :s).select('s.id, s.position')
.find_by('s.id = ?', id).try(:position)
end
private
def partition_by(chain, attribute)
chain
.select('id, ROW_NUMBER() OVER ('\
"ORDER BY #{attribute} DESC, created_at DESC"\
') as position')
end
end
答案 0 :(得分:0)
由于方法ratings_chart_last_days
可能返回nil
,因此您可以将其更改为:
def ratings_chart_last_days(number_of_days)
subset = Movie.where('movies.created_at >= ?', number_of_days.days.ago)
@ratings_chart_last_days ||= chart_position(:ratings_abs, subset)
@ratings_chart_last_days ||= 0 # Just added
end
答案 1 :(得分:0)
我不确定您的意图是什么,但是如果您仅查看最近30天制作的电影,而您没有电影,我怀疑chart_position
方法可能会返回nil
?< / p>
您可以选择将其视为前三名,也可以将其视为未排名。要将其包含在顶部位置,请返回0
,否则返回Float::INFINITY
def ratings_chart_last_days(number_of_days)
@ratings_chart_last_days ||= {}
return @ratings_chart_last_days[number_of_days] if @ratings_chart_last_days[number_of_days].present?
subset = Movie.where('movies.created_at >= ?', number_of_days.days.ago)
@ratings_chart_last_days[number_of_days] ||= chart_position(:ratings_abs, subset) || Float::INFINITY
end
我还更改了您的备忘录...无论@ratings_chart_last_days
参数如何,您总是返回number_of_days
,所以我建议@ratings_chart_last_days
应该是所有以前的哈希值计算结果,以number_of_days