如果condition为true,则添加搜索参数

时间:2017-04-19 13:42:09

标签: ruby-on-rails ruby

我的控制器中有代码,我希望为非授权用户过滤一些记录:

unless admin_signed_in?
  @posts = Post.where(hidden: false)
else
  @posts = Post.all
end

我尝试重构这个,但无法进行正确的查询

@posts = Post.where(hidden: if admin_signed_in? ? true : false )

输出:

.../app/controllers/posts_controller.rb:7: syntax error, unexpected ')', expecting keyword_then or ';' or '\n' in_signed_in? ? true : false )

4 个答案:

答案 0 :(得分:4)

您遇到语法错误。您正在使用ifternary (? :)。只需将其更改为

即可
@posts = Post.where(hidden: admin_signed_in?)

您无需手动传递truefalse

注意: 但是,如果hidden = false返回true

,它将不会返回admin_signed_in?的帖子

因此,您可能希望将其更改为

@posts = Post.where(({hidden: true} if admin_signed_in?))

答案 1 :(得分:2)

我认为您的重构不起作用,因为Post.all不会返回与Post.where(hidden: true)相同的效果。后者只会列出 隐藏但不可见的帖子。

我会将代码重构为:

@posts = Post.all
@posts = @posts.where(hidden: false) unless admin_signed_in?

答案 2 :(得分:2)

三元的问题是“如果”

@posts = Post.where(hidden: if admin_signed_in? ? true : false )

应该是

@posts = Post.where(hidden: admin_signed_in? ? true : false )

当然,您可以考虑发布的其他解决方案。

Stefan指出,管理员只会看到隐藏的帖子,而不是所有帖子,所以如果你要坚持使用三元组,那么你真的想要......

@posts = Post.where(hidden: admin_signed_in? ? [true,  false, nil] : false )

答案 3 :(得分:0)

带有unless

else非常令人困惑。我将其更改为:

if admin_signed_in?
  @posts = Post.all
else
  @posts = Post.where(hidden: false)
end

除此之外,我认为代码读起来还不错。

但是,您可以用三元运算符替换它:

@posts = admin_signed_in? ? Post.all : Post.where(hidden: false)