为什么 `where` 在 Rails 中给出 "undefined method" 错误?

Why does `where` give an "undefined method" error in Rails?

我正在尝试获取具有特定属性的所有反馈。我正在使用此代码:

def index
  feedbacks = Feedback.all
  if params[:tag]
    @average_customer_rating = feedbacks.where('buyer_feedback_date is not null').rated(Feedback::FROM_BUYERS).average(:buyer_rating) || 0
    @products = Product.includes(:images).tagged_with(params[:tag]).order('DESC').limit(22)
  else
    @products = Product.includes(:images).all
    @average_customer_rating = feedbacks.where('buyer_feedback_date is not null').rated(Feedback::FROM_BUYERS).average(:buyer_rating) || 0
  end
end

和 Rails 显示此错误:

undefined method `where' for []:Array

为什么我不能在这里使用 where,我该如何解决?

Why can't I use where on an array?

因为Arrayclass没有实例方法调用where.

因为 feedbacks.classArray,你得到一个错误。

您有两个选择:

  1. feedbacks 定义为 ActiveRecord::Relation 的实例并使用 where
  2. 未使用 where,但使用 Array class.
  3. 中的适当方法

如果 Feedback 是您的 ActiveRecord 模型,您可能会使用 Feedback.where('buyer_feedback_date is not null')

在Rails3.x、allreturns一个数组中:

feedbacks = Feedback.all  # <- an array
feedbacks.where(...)      # <- fails

要获得 ActiveRecord::Relation,您必须使用 scoped:

feedbacks = Feedback.scoped  # <- an ActiveRecord::Relation
feedbacks.where(...)         # <- works

有关更多示例,请参阅 Working with scopes


请注意,Rails 4 中不再需要这种区分 - scoped 已被弃用,取而代之的是 all,现在 returns 和 ActiveRecord::Relation

反馈 = Feedback.all

为什么要查询此 table 中的每个条目以获得

feedbacks.where('buyer_feedback_date is not null').额定(反馈::FROM_BUYERS).平均(:buyer_rating) || 0

试试这个 =>

@average_customer_rating =Feedback.where('buyer_feedback_date is not null').额定(反馈::FROM_BUYERS).平均(:buyer_rating) || 0

其他

@average_customer_rating = Feedback.where('buyer_feedback_date is not null').额定(反馈::FROM_BUYERS).平均(:buyer_rating) || 0

应将其范围限定为 cust_feedback