gpt4 book ai didi

mysql - Rails ActiveRecord,从连接表中选择不同的字段并返回所有模型

转载 作者:行者123 更新时间:2023-11-29 00:26:27 24 4
gpt4 key购买 nike

我正在使用 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 并为每个唯一的 orange_id 将唯一的 berry actions 保存到一个 Set 中,但是如果我有数以千计的礼物和多个berry actions 每个浆果。如果有 2000 个礼物和 4 个 Action ,那么我将循环 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 每行的模型。

最佳答案

尝试以下操作:

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

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

puts gifts.first.attributes

关于mysql - Rails ActiveRecord,从连接表中选择不同的字段并返回所有模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com