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

标签 ruby-on-rails redmine

我想在 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/

相关文章:

ruby-on-rails - session_store.rb 的作用是什么?

ruby-on-rails - 具有动态分割的资源

redmine - Redmine 3.x 版和 2.x 版有什么区别

linux - Linux Mandriva 上的 SVN - 从 Windows 网络浏览器访问远程存储库

ruby-on-rails - 在 Ruby on Rails3 中使用什么验证码系统?

css - 仅更改一页的背景颜色(所有其他页面保持不变)

javascript - 在 Javascript 中解析 Rails 数组时出现 "Unexpected token &"

ruby-on-rails - Ruby + Passenger - Redmine 部署问题

project-management - 在 TargetProcess 中强制执行关系工作流

ruby-on-rails - redmine 部署在 heroku 雪松上