【问题标题】:How to define named scope/class query in rails如何在 Rails 中定义命名范围/类查询
【发布时间】:2016-01-23 15:51:38
【问题描述】:

我很难理解如何在我的 Rails 应用程序中定义范围/类方法。

基本上,这是我希望它执行的查询:

self.visible(current_user) -> {
@requests.where.not(visible==group && (request.user.group != 
current_user.group))}

基本上,这是一个用户可以发布帖子/请求的网站,但我希望发布者能够限制帖子的可见性(即,如果他们选择了可见 =“组”的选项,那么其他该组之外的用户看不到它(只有共享同一“组”的用户才能看到该帖子)。

请帮助我了解语法,我不知道如何在 WHERE 语句中使用 AND 条件。

现在,我有:

scope :visible, -> (group) { joins(:user).where.not(visible: 'group', 
users:{group: group}).references(:users)}

返回的结果与我想要的相反。 但是,当我删除 not 时,它不会给我任何东西。

谢谢。

【问题讨论】:

  • 你们的模型之间是什么关系?在迄今为止编写的范围中,您引用了一个组和用户对象,但我不确定范围是在哪里定义的,以及它与其他模型的关系。
  • 其实在user表中有user.group(其中group引用了组名作为字符串)。现在很简单,我让用户将组作为字符串提供 - 组没有单独的列)。在请求表中,我有 request.visible,用户/发布者将选择它作为“可见性组”。即,作为海报,我可能是一个名为“摇滚乐队”的组的一员,我输入“摇滚乐队”作为组 (user.group = '摇滚乐队'),我的 request.visible = 组,所以控制器需要识别 request.visible = group 并允许摇滚乐队成员看到它。
  • 对不起,范围在请求模型中。我希望能够排除海报表明只有同一组的成员(通过字符串命名)才能看到它的请求。

标签: ruby-on-rails class methods named scopes


【解决方案1】:

我想你要找的是这个。

scope :visible, -> (group) { joins(:user).where("visible <> 'group' OR (visible = 'group' AND users.group = ?)", group) }

【讨论】:

  • 嘿,我试过了,它有点工作。可见性确实有其预期的效果,但它也过滤掉了其他应该看到的帖子。例如,如果帖子没有可见的(request.visible = 'nil'),那么无论用户是否共享同一个组,都应该显示它。抱歉,/mean 的“”快捷方式是什么?谢谢。
  • 对不起,我错了。这有效!似乎它不起作用,因为我以前的帖子没有可见性属性。 '' 运算符是什么?非常感谢!
  • 在 SQL 中,&lt;&gt;不等于 运算符,相当于大多数其他语言中的 !=
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多