Как я могу написать две области, которые имеют конфликтующие соединения?

Допустим, у меня есть следующая модель:

# video.rb
class Video < ActiveRecord::Base
  has_many :collection_videos, :dependent => :destroy
  has_many :collections, :through => :collection_videos
  named_scope :in_collection_one,
              :joins => :collection_videos,
              :conditions => "collection_videos.collection_id = 1"

  named_scope :in_foo_collections,
              :joins => :collections,
              :conditions => "collections.foo = true"
end

# collections.rb
class Collection < ActiveRecord::Base
  has_many :videos, :through => :collection_videos
  has_many :collection_videos, :dependent => :destroy
end

# collection_videos.rb
class CollectionVideos < ActiveRecord::Base
  belongs_to :collection
  belongs_to :video
end

Если я сделаю следующий вызов:

Video.in_collection_one.in_foo_collections

Я получу сообщение об ошибке после того, как ActiveRecord сформирует SQL-запрос, жалующийся на выполнение нескольких соединений — он попытается присоединиться к :collection_videos дважды (неправильно, следует присоединиться только один раз) и :collections один раз (это правильно). Вероятно, это вызвано ошибкой в ​​​​рельсах, но мне интересно, есть ли способ обойти это.

Примечание. Я использую Rails/ActiveRecord версии 2.3.2.


person Paul Gibler    schedule 06.01.2011    source источник


Ответы (1)


Не могли бы вы использовать :include вместо :join? См. этот вопрос для примера того, как кто-то использует :include для объединения.

person Simon    schedule 07.01.2011
comment
Та же проблема возникает, когда Rails откладывает выполнение внутреннего соединения на :include. Я думаю, что это ошибка в Rails, где версия меньше 2.3.5. - person Paul Gibler; 10.01.2011