优化RoR中的代码

时间:2015-04-24 17:17:22

标签: ruby-on-rails ruby

我有这段代码:

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。它要求使用不同的表格。

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