编写包含方法的作用域 - Rails 4.



我是 Rails 的新手,任何帮助或建议将不胜感激

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

用户.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

能否建议我如何正确将其编写为范围

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')

最新更新