проблема: activerecord (rails3), объединяя объемы в цепочку с включает

В Rails3, кажется, существует проблема при объединении в цепочку двух объемов (ActiveRelations), что у каждого есть другое, включайте:

Рассмотрите эти два объема, оба из которых хорошо работают самостоятельно:

Первый объем:

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

Работа global_only (пользователь) => (список сокращения полей от 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) }

Работа not_belonging_to (пользователь) => (список сокращения полей от 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)

Таким образом, оба из тех работают правильно индивидуально.

Теперь, объедините их в цепочку вместе:

Работа global_only (пользователь) .not_belonging_to (пользователь)

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 поэтому не приводит к сбою на 'никаком таком столбце 'участников user_id'. Если я объединю объемы в цепочку в обратном порядке, то соединение 'участников будет присутствовать, и соединение 'стран' будет потеряно. Это всегда - второе соединение, которое потеряно, это кажется.

Делает это похоже на ошибку с ActiveRecord, или я делающий что-то не так или это "функция" :-)

(PS. Да, я знаю, я могу создать объем, который присоединяется к обеим таблицам, и он правильно приведет к результату, который я хочу. У меня уже есть это. Но я пытался сделать меньшие объемы, чем можно объединить в цепочку вместе по-разному, который, как предполагается, является преимуществом activerecord по прямому sql.)

6
задан insane.dreamer 3 August 2010 в 01:29
поделиться