gpt4 book ai didi

ruby-on-rails - 优化 RoR 中的代码

转载 作者:太空宇宙 更新时间:2023-11-03 18:13:32 25 4
gpt4 key购买 nike

我有这个代码:

def self.by_vibe(vibe_id)
self.joins(:vibes).where(vibes: {id: vibe_id})
end

这段代码在我的整个模型中重复(有一些不同),例如:

def self.by_music(music_id)
self.joins(:musics).where(musics: {id: music_id})
end

我有四个或五个这样的东西,想只做一个,结果是这样的(供引用,hash 包含 {:vibes=>2}):

def self.by(hash)
self.joins(hash.keys.first).where(hash.keys.first.to_s => id = hash.values.first)
end

我的 self.by_vibe 做了这个查询:

 SELECT "bcls".* FROM "bcls" INNER JOIN "bcls_vibes" ON "bcls_vibes"."bcl_id" = "bcls"."id" INNER JOIN "vibes" ON "vibes"."id" = "bcls_vibes"."vibe_id" WHERE "vibes"."id" = $1  [["id", 2]]

我的第二种方法是:

 SELECT "bcls".* FROM "bcls" INNER JOIN "bcls_vibes" ON "bcls_vibes"."bcl_id" = "bcls"."id" INNER JOIN "vibes" ON "vibes"."id" = "bcls_vibes"."vibe_id" WHERE "bcls"."vibe_id" = 2

我该如何修复 where 子句?请注意第一个(正确的是 WHERE "vibes"."id"= $1 [["id", 2]] 而错误的是 WHERE "bcls"."vibe_id"= 2。它正在请求一个不同的表。

最佳答案

可以获得第一个值和第一个键:

def self.by(hash)
self.joins(hash.keys.first).where(
{ hash.keys.first.to_s => { id: hash.values.first } }
)
end

如果您只接受散列中的一个键值对,尽管将两个参数传递给 by 可能会更好:

def self.by(assoc, obj_id)
self.joins(assoc).where(assoc => { id: obj_id })
end

关于ruby-on-rails - 优化 RoR 中的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29853633/

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