编写包含方法的Scope - Rails 4

时间:2016-04-22 00:07:08

标签: ruby-on-rails-4

我是rails的新手,非常感谢任何帮助或建议

  • 我正在尝试编写一个范围,显示评级等于或大于4的用户。我不确定为什么我的范围不起作用,我们非常感谢您的帮助
  

user.rb

scope :ratings_equal_and_greater_than_4, where('average_rating_final_score >= 4')

def average_rating_final_score
    if self.average_rating_score == 1.0
      1
    elsif self.average_rating_score == 2.0
      2
    elsif self.average_rating_score == 3.0
      3
    elsif self.average_rating_score == 4.0
      4
    elsif self.average_rating_score == 5.0
      5
    else
      self.average_rating_score
    end    
  end

  def average_rating_score
    ratings_total.to_f / ratings_count
  end

当这样编写时,范围很有效:

<% if user.average_rating_final_score >= 4 %>
   # display users with ratings equal to or greater than 4 star
<% end %>

但我想在我的观点中写出类似的东西

@users.ratings_equal_and_greater_than_4

有人可以建议我如何正确地写这个作为范围

1 个答案:

答案 0 :(得分:2)

Rails范围是AREL - 一种ruby包装的sql。 这意味着你不能像这样从SQL WHERE语句中调用ruby代码:

where('average_rating_final_score >= 4')

但您可以定义可以按需使用的类方法:

def self.ratings_equal_and_greater_than_4
  all.reject{ |record| record.average_rating_final_score < 4 }
end

您也可以编写propper SQL查询:

where('(`table_name.ratings_total` / `table_name.ratings_count`) >= 4')