我有两个范围,在我的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)
答案 0 :(得分:0)
我相信你看到这个是因为.uniq会对其进行操作并返回一个数组,因此你的范围不会返回范围。
尝试使用SQL" DISTINCT"在加入后的.select()中。
scope :users_with_school, joins("right outer join ...").select("DISTINCT users.id")