#<Array 的未定义方法

undefined method for #<Array

我里面有这个User型号

def self.home_opinions (user) 
        home_opinions = user.opinions
        user.follows.find_each do |follow|
          home_opinions+=(follow.opinions)
        end
        home_opinions.order_by_most_recent
    end

我在 Opinion 模型中有这个范围

scope :order_by_most_recent, -> { includes(:author).order(created_at: :desc) }

显示这个错误

undefined method `order_by_most_recent' for #<Array:0x00007eff64d076f8>

但是当我在 rails 控制台中尝试 User.home_opinions(User.find(9)) 有效

我有两个问题

  1. 为什么显示错误
  2. 此代码可能使用 includes 的最佳做法是什么?

.order_by_most_recent 仅适用于 ActiveRecord::Relation.

当您调用 home_opinions = user.opinions 时,您会得到一个关系对象。

调用的时候问题来了

home_opinions += follow.opinions

该操作将关系转换为数组,然后 .order_by_most_recent 不再可用。

如果可以,您应该尝试在单个 ActiveRecord 调用中获得所有相关意见。这样,您将拥有一个可以与其他作用域链接的 ActiveRecord::Relation 对象 – 另外,您可以在固定数量的数据库调用中完成所有操作,而不是对 [=17= 的每个成员进行额外调用]协会。

试试这样的东西:

opinion_owner_ids = [user.id] + user.follow_ids
home_opinions = Opinion.where(user_id: opinion_owner_ids)
home_opinions.order_by_most_recent