【问题标题】:Rails3 & ActiveRecord::Relation - Arel and ORRails3 和 ActiveRecord::Relation - Arel 和 OR
【发布时间】: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


【解决方案1】:
【解决方案2】:
Event.for_company(Company.find(1)).issues

【讨论】:

  • 链式作用域提供AND 操作
猜你喜欢
  • 2011-12-20
  • 2011-08-01
  • 2013-05-27
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多