1

我正在使用 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

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

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

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

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模型。

4

1 回答 1

1

尝试以下操作:

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

giftsselect将保存一个仅具有初始化中指定的属性的礼物数组:

puts gifts.first.attributes
于 2013-09-08T19:32:42.827 回答