#<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))
有效
我有两个问题
- 为什么显示错误
- 此代码可能使用
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
我里面有这个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))
有效
我有两个问题
- 为什么显示错误
- 此代码可能使用
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