假设我有以下两个对象:
first_name_relation = User.where(:first_name => 'Tobias') # ActiveRecord::Relation
last_name_relation = User.where(:last_name => 'Fünke') # ActiveRecord::Relation
有没有可能将这两个关系组合在一起,生成一个同时包含这两个条件的ActiveRecord::Relation
对象?
注意:我知道我可以链接到哪里来获得这个行为,我真正感兴趣的是我有两个独立的ActiveRecord::Relation
对象的情况。
发布于 2013-03-06 07:17:21
关系对象可以转换为数组。这就否定了以后可以对它们使用任何ActiveRecord方法,但我不需要这样做。我这样做了:
name_relation = first_name_relation + last_name_relation
Ruby 1.9,rails 3.2
发布于 2014-12-11 19:25:51
实际上,merge
并不像OR
那样工作。这是简单的交集(AND
)
为了将ActiveRecord::Relation对象合并为一个对象,我努力解决了这个问题,但我没有找到任何适合我的解决方案。
我没有寻找从这两个集合创建并集的正确方法,而是专注于集合代数。您可以使用De Morgan's law以不同的方式完成此操作
ActiveRecord提供了merge方法(和),您也可以使用not方法或none_of (NOT)。
search.where.none_of(search.where.not(id: ids_to_exclude).merge(search.where.not("title ILIKE ?", "%#{query}%")))
这里有(A U B)‘= A’^ B‘
更新:上面的解决方案适用于更复杂的情况。在你的例子中,像这样的smth就足够了:
User.where('first_name LIKE ? OR last_name LIKE ?', 'Tobias', 'Fünke')
发布于 2015-05-12 06:39:00
有一个名为active_record_union的宝石可能就是你要找的。
它的示例用法如下:
current_user.posts.union(Post.published)
current_user.posts.union(Post.published).where(id: [6, 7])
current_user.posts.union("published_at < ?", Time.now)
user_1.posts.union(user_2.posts).union(Post.published)
user_1.posts.union_all(user_2.posts)
https://stackoverflow.com/questions/9540801
复制相似问题