我正在使用 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 actions
berry 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 方法做到这一点吗?我希望能够遍历此查询的每一行并对我选择的字段执行操作。如果关联的模型也可以返回也很好,这样我就可以获取每一行的basket
、orange
、berry
和action
模型。