【发布时间】: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 方法做到这一点?我希望能够遍历此查询的每一行并对我选择的字段执行操作。如果关联的模型也可以返回也很好,这样我就可以为每一行获取basket、orange、berry 和action 模型。
【问题讨论】:
标签: mysql ruby-on-rails ruby ruby-on-rails-3 activerecord