【问题标题】:Rails ActiveRecord, selecting distinct fields from a joined table and returning all the modelsRails ActiveRecord,从连接表中选择不同的字段并返回所有模型
【发布时间】:2013-09-09 03:32:42
【问题描述】:

我正在使用 MySQL 开发 Rails 应用程序。
我有一个这样的表:

gifts
id, basket_id, orange_id, berry_id

berries
id, action_id, name

这些是他们的模型:

class Gift < ActiveRecord::Base
  belongs_to :basket
  belongs_to :orange
  belongs_to :berry
  ...
end

class Berry < ActiveRecord::Base
  belongs_to :action
  has_one :gift
  ...
end

class Basket < ActiveRecord::Base
  has_many :gifts
  ...
end

在篮子模型中,我有 gifts 变量,其中包含这个篮子的所有礼物,通过我在篮子模型中定义的关联 - 基本上是 "SELECT * FROM gifts WHERE basket_id = ?", self.id

我想将每个橙色的所有唯一 berry actions 分组。
目前的做法:

def get_data
  data = {}
  gifts.each |gift| do
    orange_id = gift.orange_id
    data[orange_id] ||= { :basket_id => gift.basket_id, :name => gift.orange.name, :actions => Set.new }
    data[orange_id] << { :action_name => gift.berry.action.name }
  end
return data

我的方法是遍历 gifts 并将唯一的 berry actions 保存到每个唯一的 orange_id 的 Set 中,但是如果我有成千上万的礼物,每个浆果都有多个 berry actions,这种方法会很慢。如果有2000个礼物和4个动作,那么我循环了8000次。

礼物可以有相同的橙子和篮子,但总是有不同的浆果。

我想改为执行此查询,这样会更快,因为我将遍历独特的橙子而不是所有礼物(每个篮子只有几百个橙子)。

SELECT DISTINCT g.basket_id, g.orange_id, g.berry_id, b.action_id 
FROM gifts AS g 
JOIN berries AS b
ON g.berry_id = b.id

谁能告诉我如何使用 Rails ActiveRecord 方法做到这一点?我希望能够遍历此查询的每一行并对我选择的字段执行操作。如果关联的模型也可以返回也很好,这样我就可以为每一行获取basketorangeberryaction 模型。

【问题讨论】:

    标签: mysql ruby-on-rails ruby ruby-on-rails-3 activerecord


    【解决方案1】:

    尝试以下方法:

    gifts = Gift.joins(:berry).select(:basket_id, :orange_id, :berry_id, :action_id).uniq.to_a
    

    gifts 将保存一组礼物,其中仅具有select 中指定的属性,已初始化:

    puts gifts.first.attributes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多