gpt4 book ai didi

ruby-on-rails - Rails 在范围内选择

转载 作者:数据小太阳 更新时间:2023-10-29 07:32:13 25 4
gpt4 key购买 nike

在我的模型 User 中,我设置了范围:

scope :count_likes, lambda { 
select("(SELECT count(*) from another_model) AS count")
}

如果我想获得我的用户的所有属性 + count_likes,我必须这样做:

Model.count_likes.select("users.*")

因为调用 select() 将默认 "*"

我在我的应用程序中使用了很多 count_likes 范围,我的问题是我必须在任何地方附加 select("users.*")。

我知道默认范围,但是,我不认为在默认范围内执行 select("users.*") 是个好主意。

有没有干的/更好的方法来做到这一点?

谢谢

最佳答案

这不是真正的另一个答案。我想对连接发表评论,但评论不能长,我想提供代码示例。

您需要的是有时获取相关表的所有字段和计数,有时获取没有 users.* 字段的计数(有时可能只是没有计数的 user.* 字段)。所以,你将不得不告诉代码你想要哪一个。我认为你正在寻找的是一种异常(exception)类型的东西,默认情况下你会得到 user.* 字段和计数,但是当你只想要计数时,指定关闭 select('user.*')。我认为没有这样的解决方案,除非使用默认范围。我建议只为计数设置一个范围,为用户字段和计数设置一个范围。

这是我会做的:

class Users
has_many :likes

def self.with_count_likes
joins(:likes)
.select('users.*, count(likes.id) as count')
.group('users.id')
end

def self.count_likes
joins(:likes)
.select('users.id, users.username, count(likes.id) as count')
.group('users.id')
end
...

当您需要所有用户字段和点赞计数时,调用 with_count_likes(或将其链接到查询中)。如果您只需要计数和一些标识字段,请调用 count_likes。

我在这里假设,无论何时您需要计数,您都希望一些用户字段来标识计数的目的/(谁)。

请注意,某些数据库(如 Oracle)可能需要按“users.*”分组。这是 SQL 中的标准,但一些数据库如 mySQL 只使用主键。

关于ruby-on-rails - Rails 在范围内选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19972848/

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