Rails 3 ActiveRecord where子句,其中id被设置或为null



我有一个ActiveRecord,Annotation,有两列:user_id和post_id,这两列可以为null。user_id和post_id为null的注释是"全局"注释,适用于所有用户的所有帖子。

我想检索与特定用户的帖子相关联的所有注释和所有全局注释。在MySQL中,SQL命令是

select * from annotations where (user_id = 123 and post_id = 456) or (user_id is null and post_id is null)

在Rails3中,将其编码为Annotation.where子句的最佳方式是什么?

不幸的是,没有真正好的方法来使用OR sql语法。最好的两种选择可能是使用绑定参数自己编写where子句:

annotations = Annotation.where("(user_id = ? and post_id = ?) OR (user_id is null and post_id is null)").all

或者,你可以深入研究Arel,并使用该语法来制作它(查看ascicast的Arel帖子)。

警告or调用中的所有内容都是伪代码,不知道如何执行"post_id为null"-您可能只需要将"user_id为null,post_id是null"传递给or(),但我的最佳猜测是:

annotations = Annotation.arel_table
annotations.where(annotations[:user_id].eq(123).
            and(annotations[:post_id].eq(456)).
            or(annotations[:user_id].eq(nil).and(annotations[:post_id].eq(nil))

相关内容

  • 没有找到相关文章

最新更新