gpt4 book ai didi

ruby-on-rails - 使用 self.calculate 的未定义错误

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

我想在 Rails 中执行 mysql 函数 GROUP_CONCAT。
我正在使用事件记录的计算方法。
像这样 self.calculate(:group_concat, :id)

我不知道这是否是正确的方法。

关于如何在 rails 中执行 group_concat 的任何想法?
以及activerecord的find方法。

最佳答案

正如上面@Camway 所指出的,这可以使用正确的 Rails 方法来轻松完成 JOINing、SELECTing 和 GROUPing。举个例子,假设我有用户和区域,一个用户可以有 0 对多的区域,一个区域可以有 0 对多的用户。

这是我的 地区 模型:

class Region < ActiveRecord::Base
# attributes: id (integer), code (string)
has_and_belongs_to_many :users
end

这是我的 用户 模型:
class User < ActiveRecord::Base
# attributes: id (integer), email (string)
has_and_belongs_to_many :regions
end

当然,还有一个 region_users 连接带有 region_id 和 user_id 整数字段的表。

为了获得一个通用的 GROUP_CONCAT 工作来提取每个用户附加到的所有区域的代码,我只需要向 User 模型添加一个这样的类方法:
class User < ActiveRecord::Base
# attributes: id (integer), email (string)
has_and_belongs_to_many :regions

class << self
def regions_listing
joins(:regions)
.select("DISTINCT users.email, GROUP_CONCAT(DISTINCT regions.region_code ORDER BY regions.region_code) AS regions_list")
.group("users.email")
.order("users.email")
end
end
end

因此,只要准备好那一小段代码,以下内容就会按电子邮件地址拉取所有用户。
ruby > User.regions_listing
=> [#<User email: "joe@blow.com">,#<User email: "sally@mae.com">,#<User email: "billy@bob.com">,#<User email: "jane@doe.com">,#<User email: "big@ed.com">]

每个返回的对象都有一个 #regions_list 属性读取器将为您提供通过 region_users 表附加到该用户的区域的代码的组级联列表。

这可以通过对#map 的简单调用来查看:
ruby > User.regions_listing.map { |u| [u.email, u.regions_list] }
=> [["joe@blow.com", "0,1,2,3,4,5"], ["sally@mae.com", "1,2,5"], ["billy@bob.com", "0,4"], ["jane@doe.com", "3"], ["big@ed.com", "2,3,4,5"]]

请注意,由于这是使用适当的 AREL 支持的 AR 方法,因此它是 可链接 .也就是说,您可以添加 ".regions_listing"在几乎任何针对 User 模型的 AR 查询结束时,它都会为您的查询选择的任何 User 对象提供组连接的方法/数据。

像这样:
ruby > User.where("users.email like 'b%'").regions_listing.map { |u| [u.email, u.regions_list] }
=> [["billy@bob.com", "0,4"], ["big@ed.com", "2,3,4,5"]]

您还可以使用 HAVING 获取您制造的 #regions_list 字段中的数据,例如查找附加到区域 0 和区域 4 的所有用户:
ruby > User.regions_listing.having("regions_list LIKE '%0%4%'").map { |u| [u.email, u.regions_list] }
=> [["joe@blow.com", "0,1,2,3,4,5"], ["billy@bob.com", "0,4"]]

关于ruby-on-rails - 使用 self.calculate 的未定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8831176/

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