Active Record вызывает присоединение областей при перезагрузке? - PullRequest
0 голосов
/ 12 октября 2011

У меня есть две области с правыми внешними объединениями, объявленными в моей модели 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, рельсы 3.1.1 ruby ​​1.9.2)

1 Ответ

0 голосов
/ 14 октября 2011

Я полагаю, что вы видите это, потому что .uniq действует и возвращает массив, и поэтому ваша область не возвращает область.

Попробуйте использовать SQL "DISTINCT" в .select () после объединения.

scope :users_with_school, joins("right outer join ...").select("DISTINCT users.id")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...