【问题标题】:undefined method for #<Array#<Array 的未定义方法
【发布时间】:2021-06-19 18:18:44
【问题描述】:

我在 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 的最佳做法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord ruby-on-rails-5


    【解决方案1】:

    .order_by_most_recent 仅适用于 ActiveRecord::Relation

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

    问题来了

    home_opinions += follow.opinions
    

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

    如果可以,您应该尝试在一次 ActiveRecord 调用中获得所有相关意见。这样,您将拥有一个 ActiveRecord::Relation 对象,您可以将其与其他范围链接在一起——此外,您可以在固定数量的数据库调用中完成所有操作,而不是对 follows 关联的每个成员进行额外调用。

    尝试类似:

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

    【讨论】:

    • def self.home_opinions (user) follows_ids = [] user.follows.find_each do |follow| follows_ids.push(follow.id) end ` ids = [user.id] + [follows_ids]` ` home_opinions = Opinion.where(author_id: ids)` @987654335 @`end`我做到了,谢谢你!
    • 顺便说一句,如何在堆栈溢出的注释中添加多行代码:D?
    • 您不需要通过循环user.follows 来构建自己的 ID 数组。如果您在User 模型中声明了has_many :follows,您将自动获得一个名为follow_ids 的方法,其中包含所有ID 记录。查看Rails docs 中的示例部分。
    • 是的,我做到了,再次感谢 ids = [user.id] + user.follow_ids home_opinions = Opinion.where(author_id: ids) home_opinions.order_by_most_recent
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2013-10-12
    • 2018-10-18
    • 1970-01-01
    相关资源
    最近更新 更多