新手问题 请教更简洁的写法

birbird · 2015年08月21日 · 最后由 birbird 回复于 2015年08月23日 · 2500 次阅读

我有一个方法,之前是这样的

def circles
  Circle.in(id: memberships.pluck(:circle_id))
end

加了一个参数,做了个判断,就平白多了很多行,请问有没有更简洁的写法,谢啦先!

def circles(status)
  local_memberships = memberships
  if (status)
    local_memberships = local_memberships.where(status: status)
  end
  Circle.in(id: local_memberships.pluck(:circle_id))
end

Circle.in(id: (status.nil? ? memberships : memberships.where(status: status)).pluck(:circle_id))

然而不见得比你写的读起来清楚

不能再简单了吧... 最多挤成一行但逻辑并没有简化

另外,可以用 nested select 减少一个查询?

Circle.in id: (status ? memberships.where(status: status) : memberships).select(:circle_id)

#2 楼 @luikore 原来 #nil? 是不用的啊,看来我的项目里有很多多余的字符......

#3 楼 @blacktulip 他的逻辑没检查 nil 就照抄了...

#4 楼 @luikore 嗯?我还以为是一样的,我试了下好像确实是一样的,status 是 nil 的时候运行逻辑也没错

#5 楼 @blacktulip falsenil 都是 false-y, 其他都是 true-y

#6 楼 @luikore 这个我知道,不知道的是可以直接在后面跟个问号判断

Circle.joins(:memberships).where(memberships: { status: status, user_id: id })

#8 楼 @rei :thumbsup: 用 join 多简单... 数据库也可以根据匹配的 membership 数量多少来选择优化方法

#7 楼 @blacktulip ?! 与 if-else 的要求应该是一样的。 只要能转换成 true / false 的都可以。 (Ruby 里应该所有的东西都能转布尔吧)

#9 楼 @rei 忘了说了,我这是 Mongoid,不是 ActiveRecord,Mongoid 没有 through 的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号