首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在RoR中优化代码

在RoR中优化代码
EN

Stack Overflow用户
提问于 2015-04-24 17:17:22
回答 2查看 51关注 0票数 1

我有这样的代码:

代码语言:javascript
运行
复制
def self.by_vibe(vibe_id)
  self.joins(:vibes).where(vibes: {id: vibe_id})
end

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

代码语言:javascript
运行
复制
def self.by_music(music_id)
  self.joins(:musics).where(musics: {id: music_id})
end

我有四到五个这样的东西,我只想做一个,然后拿出这样的东西(作为参考,hash包含{:vibes=>2}):

代码语言:javascript
运行
复制
def self.by(hash)
  self.joins(hash.keys.first).where(hash.keys.first.to_s => id = hash.values.first)
end

我的self.by_vibe提出了以下查询:

代码语言:javascript
运行
复制
 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]]

我的第二种方法是:

代码语言:javascript
运行
复制
 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 )。它要求换一张桌子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-24 18:11:23

我刚刚找到了正确的方法来做我想做的事。

代码语言:javascript
运行
复制
def self.by(hash)
  self.joins(hash.keys.first).where(hash.keys.first.to_s => {id: hash.values.first})
end
票数 0
EN

Stack Overflow用户

发布于 2015-04-24 17:25:17

您可以获得第一个值以及第一个键:

代码语言:javascript
运行
复制
def self.by(hash)
   self.joins(hash.keys.first).where(
     { hash.keys.first.to_s => { id: hash.values.first } }
   )
end

但是,如果您只接受散列中的一个键值对,则最好为by设置两个参数

代码语言:javascript
运行
复制
def self.by(assoc, obj_id)
  self.joins(assoc).where(assoc => { id: obj_id })
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29853633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档