我有这段代码:
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
。它要求使用不同的表格。
答案 0 :(得分:3)
您可以获得第一个值以及第一个键:
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
答案 1 :(得分:0)
我刚刚找到了做我想做的事情的正确方法。
def self.by(hash)
self.joins(hash.keys.first).where(hash.keys.first.to_s => {id: hash.values.first})
end