Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 问题:activerecord(rails3),将作用域与includes链接_Ruby On Rails_Activerecord_Ruby On Rails 3_Arel - Fatal编程技术网

Ruby on rails 问题:activerecord(rails3),将作用域与includes链接

Ruby on rails 问题:activerecord(rails3),将作用域与includes链接,ruby-on-rails,activerecord,ruby-on-rails-3,arel,Ruby On Rails,Activerecord,Ruby On Rails 3,Arel,在Rails3中,链接两个作用域(ActiveRelations)时似乎存在问题,每个作用域都有不同的include: 考虑这两个作用域,它们各自都可以正常工作: 第一个范围: scope :global_only, lambda { |user| includes(:country) .where("countries.area_id <> ?", user.area) } scope:global_only,lambda{124; user| 包括(:国家) .where(“c

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

考虑这两个作用域,它们各自都可以正常工作:

第一个范围:

scope :global_only, lambda { |user|
includes(:country)
.where("countries.area_id <> ?", user.area) }
scope:global_only,lambda{124; user|
包括(:国家)
.where(“countries.area\u id?”,user.area)}
Work.global_only(user)=>(从SQL中剪切字段列表以确保易读性)

从“工作”左侧外部选择*并在“国家”上连接“国家”。“id”=“工作”。“国家/地区id”其中(countries.area\u id 3)
现在是第二个范围:

scope :not_belonging_to, lambda { |user| 
includes(:participants)
.where("participants.user_id <> ? or participants.user_id is null", user) }
范围:不属于,lambda{user}
包括(:参与者)
.where(“participants.user\u id?或participants.user\u id为空”,user)}
Work.not_隶属于(用户)=>(从SQL中剪切字段列表以确保易读性)

SELECT*从“工作”左侧外部加入“参与者”。“工作id”=“工作”。“id”其中(participants.user\u id 6或participants.user\u id为空)
因此,这两种方法各自都能正常工作

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

Work.global_only(用户)。not_归属于(用户)

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)
SELECT(字段列表)从“works”左侧外部加入“countries”中的“countries”。“id”=“works”。“country\u id”其中(participants.user\u id 6或participants.user\u id为空)和(countries.area\u id 3)
如您所见,第二个作用域中的连接被完全忽略。因此,SQL在“没有这样的列”参与者上失败。如果我以相反的顺序链接作用域,那么“参与者”联接将出现,“国家”联接将丢失。似乎总是第二个连接丢失

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


(顺便说一句,是的,我知道,我可以创建一个连接两个表的作用域,它将正确地产生我想要的结果。我已经有了。但我试图创建一个比可以以不同方式链接在一起更小的作用域,这应该是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)

原来这是一个bug;正在为下一个Rails3发行版进行修补。是的,现在只需要包含1次,因此如果您想避免此问题,请创建一个新的范围,其中包含这两个。。。包括(:国家,:参与者)。。。哎呀。。。我才意识到那是车太多了叹气。。。很抱歉
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)
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)