ruby-on-rails - 问题 : activerecord (rails3), 使用包含链接作用域

标签 ruby-on-rails activerecord ruby-on-rails-3 arel

在 Rails3 中,链接两个作用域(ActiveRelations)时似乎有问题,每个作用域都有不同的包括:

考虑这两个范围,它们都可以正常工作:

第一个范围:

scope :global_only, lambda { |user|
includes(:country)
.where("countries.area_id <> ?", user.area) }

Work.global_only(user) =>(从 SQL 中删除字段列表以提高可读性)
SELECT * FROM "works" LEFT OUTER JOIN "countries" ON "countries"."id" = "works"."country_id" WHERE (countries.area_id <> 3)

现在第二个范围:
scope :not_belonging_to, lambda { |user| 
includes(:participants)
.where("participants.user_id <> ? or participants.user_id is null", user) }

Work.not_belonging_to(user) =>(从 SQL 中剪切字段列表以提高可读性)
SELECT * FROM "works" LEFT OUTER JOIN "participants" ON "participants"."work_id" = "works"."id" WHERE (participants.user_id <> 6 or participants.user_id is null)

所以这两者都可以单独正常工作。

现在,将它们链接在一起:

Work.global_only(user).not_belonging_to(user)

SQL:
SELECT (list of fields) FROM "works" LEFT OUTER JOIN "countries" ON "countries"."id" = "works"."country_id" WHERE (participants.user_id <> 6 or participants.user_id is null) AND (countries.area_id <> 3)

如您所见,来自第二个作用域的连接被完全忽略。因此,SQL 在“没有这样的列 'participants.user_id' 上失败。如果我以相反的顺序链接范围,则将出现“参与者”联接,而“国家/地区”联接将丢失。似乎总是第二个连接丢失。

这看起来像 ActiveRecord 的错误,还是我做错了什么,或者这是一个“功能”:-)

(PS。是的,我知道,我可以创建一个连接两个表的范围,它会正确地产生我想要的结果。我已经有了。但我试图制作比可以以不同方式链接在一起的更小的范围,这应该是 activerecord 相对于直接 sql 的优势。)

最佳答案

作为一般规则,使用 :includes用于急切加载和 :joins为条件。在第二个范围内,必须手动编写连接 SQL,因为需要左连接。

也就是说,试试这个:

scope :global_only, lambda { |user|
  joins(:country).
  where(["countries.area_id != ?", user.area])
}

scope :not_belonging_to, lambda { |user|
  joins("left join participants on participants = #{user.id}").
  where("participants.id is null")
}

Work.global_only(user).not_belonging_to(user)

关于ruby-on-rails - 问题 : activerecord (rails3), 使用包含链接作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3393013/

相关文章:

ruby-on-rails - application.html.erb 根据用户所在的页面呈现不同的部分

ruby-on-rails - 突然在 UsersController#create 中得到 Errno::ECONNREFUSED

ruby-on-rails - Rails 删除重复的关联记录

javascript - Ruby on Rails 中的通知栏

ruby - 如何检查关联属性的非零值 - 有没有更简洁的方法?

ruby-on-rails - ruby rails : Convert a path in a string to a recursive Hash

ruby-on-rails - 在调用期间更改 `Proc` 绑定(bind)

mysql - Rails 4 MySQL bigInt 主键问题和错误

ruby-on-rails - ActiveRecord 集合和自定义方法

ruby-on-rails - 为什么 Rails ` error ' 的语法带有勾号和引号?