Active Record在重新加载时调用连接范围?

时间:2011-10-12 11:53:31

标签: ruby-on-rails ruby activerecord

我有两个范围,在我的User模型上声明了右外连接。他们在这里

scope :users_with_school, joins("right outer join profiles on profiles.user_id = users.id     right outer join profiles_schools on profiles.id = profiles_schools.profile_id").uniq
scope :full_profile,  joins("right outer join profiles on profiles.user_id = users.id right outer join profiles_schools on profiles.id = profiles_schools.profile_id where users.pic_file_name is not null and profiles.occupation is not null and birthday is not null and profiles.desc is not null and hometown is not null ").uniq

我的问题是,当我重新加载我的控制台并调用User.all时,我看到这两个范围都在执行(即我在控制台窗口中看到了SQL),但我没有看到任何其他范围。它似乎没有影响查询的结果,但是我仍然对它们为什么首先被执行感到困惑。

这是一个例子     ruby-1.9.2-p290:023>重装!     重装...

 => true 
ruby-1.9.2-p290 :024 > User.all.count
User Load (296.5ms)  SELECT "users".* FROM "users" right outer join profiles on     profiles.user_id = users.id right outer join profiles_schools on profiles.id = profiles_schools.profile_id
 User Load (7.4ms)  SELECT "users".* FROM "users" right outer join profiles on profiles.user_id = users.id right outer join profiles_schools on profiles.id = profiles_schools.profile_id where users.pic_file_name is not null and profiles.occupation is not null and birthday is not null and profiles.desc is not null and hometown is not null
 User Load (435.8ms)  SELECT "users".* FROM "users" 

=> xxxx Users

然后当我再次执行查询而不重新加载时,它只执行User.all查询

ruby-1.9.2-p290 :025 > User.all.count
User Load (606.7ms)  SELECT "users".* FROM "users" 
=> xxxx Users (the same as above)

所以,我的问题是,为什么会发生这种情况,为什么它只发生在这两个范围内(大约30个左右),我能看到的唯一区别是它们是正确的外连接

显然我不希望每次加载User类时都运行这些作用域,目前它似乎只是在我重新加载所有内容时。有什么见解吗?

(使用postgres,rails 3.1.1 ruby​​ 1.9.2)

1 个答案:

答案 0 :(得分:0)

我相信你看到这个是因为.uniq会对其进行操作并返回一个数组,因此你的范围不会返回范围。

尝试使用SQL" DISTINCT"在加入后的.select()中。

scope :users_with_school, joins("right outer join ...").select("DISTINCT users.id")