【发布时间】:2011-03-11 10:39:27
【问题描述】:
我在一个名为 Events 的模型中定义了一些范围。现在我需要使用 OR 运算符加入他们。我正在使用 Rails3,我对 ActiveRelation 和 Arel 以及我应该如何以及如何使用它有点困惑
scope :issues, where(:subject_type => "Issue")
scope :for_company, lambda {|company| joins(:user)
.where(:users => { :company_id => company.id })
.includes(:user)}
如何获取事件
for_company(x) OR issues
当我尝试Events.for_company(X).or(issues) 时出现错误
Events.for_company(Company.find(1)).or(Events.issues)
NoMethodError:#ActiveRecord::Relation 的未定义方法“或”
使用Events.for_company(Company.find(1)).arel.or(Events.issues) 我明白了
NoMethodError:#Arel::SelectManager 的未定义方法“或”
我想获取所有问题或用户来自确定公司的事件。
select * from events
join users
on events.user_id = users.id
where users.company_id = 1
or events.subject_type = "Issues"
谢谢。
【问题讨论】:
-
您能否更具体地说明您想要得到的结果。您的一个作用域正在执行连接,因此您不能只添加另一个不连接的查询,而不对其进行连接或省略连接列。
-
首先,您在第二个范围内为用户加入和包含。这是不正确的,只需留下连接或包含(我认为包含仅适用于 OR)。对这两个查询进行 OR 并不容易,但您可以使用 arel_table 来完成。
标签: ruby-on-rails-3 arel active-relation