gpt4 book ai didi

activerecord - 为什么/如何在关系返回的集合/数组上调用模型的类方法?

转载 作者:行者123 更新时间:2023-12-01 02:52:06 25 4
gpt4 key购买 nike

所以我今天遇到了一段有趣的代码,它引起了我的注意。我不认为这是可能的。代码行是:

@post.comments.approved_comments

看起来不错,对吧?但真正发生的是 approved_commentsArray 的实例上调用方法 has_many 返回的对象关系(即,一个帖子有很多评论)。更有趣的是 approved_comments是在 Comment 上定义的类方法模型。

让我有点困惑的是,我认为你不能直接链接关系,至少因为关系返回 Array。 ,而不是 ActiveRecord::Relation目的。我之前问过一个与此相关的问题,给我的答案是您可以使用 scoped 链接关系。方法或由于关系而添加到数组的许多方法之一(即 Section 4.3.1 Methods Added by has_many )。

让我感到困惑的是 approved_comments是我们写的一个方法;它不是 has_many 添加的方法关系法。那么我怎么可能访问它呢?更令人困惑的是,我怎么能通过 Array 访问它?目的?

当然,有一些魔法正在发生。我想知道是否有人可以向我指出一些文档,或者是否有专家对此有答案。不是一个大问题,因为它似乎工作得很好,但我真的很想知道如何教育自己。

我在这里先向您的帮助表示感谢!

代码

邮政
class Post
has_many :comments
end

评论
class Comment
def self.approved_comments
where(:approved => true)
end
end

用法
@post.comments.approved_comments

最佳答案

它与 ActiveRecord 加载查询的方式有关。在您调用对象上的方法之前,它不会执行。因此,它可以更有效地构建整个查询。但是,使用范围更容易完成您尝试做的事情:

class Post
has_many :comments
end

class Comment
scope :approved_comments, where(:approved => true)
end

现在您可以使用 Comment.approved_comments 来获取所有已批准的评论,或使用 @post.comments.approved_comments 来获取已批准的帖子评论。

此外,作用域可以采用可选参数。如果您想获得自用户上次访问以来的所有帖子(例如):
class Comment
scope :approved_since, lambda{ |date| where(['approved_at > ?', date]) }
end

然后您可以调用: @post.comments.approved_since(@user.last_login)例如

Rails ActiveRecord Named Scope了解更多信息。

关于activerecord - 为什么/如何在关系返回的集合/数组上调用模型的类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4610036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com