首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >组合两个ActiveRecord::Relation对象

组合两个ActiveRecord::Relation对象
EN

Stack Overflow用户
提问于 2012-03-03 05:46:09
回答 7查看 119.6K关注 0票数 188

假设我有以下两个对象:

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对象的情况。

EN

回答 7

Stack Overflow用户

发布于 2013-03-06 07:17:21

关系对象可以转换为数组。这就否定了以后可以对它们使用任何ActiveRecord方法,但我不需要这样做。我这样做了:

name_relation = first_name_relation + last_name_relation

Ruby 1.9,rails 3.2

票数 41
EN

Stack Overflow用户

发布于 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')
票数 22
EN

Stack Overflow用户

发布于 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)
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9540801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档