2016-05-18 3 views
0

У меня есть модель Container которая has_and_belongs_to_many Papers которая has_one Status.с именем scope overriding attributes rails

Я хочу иметь именованный scope на модели Container, которая даст мне все контейнеры, заполненные только бумагами, содержащими определенный набор статусов.

У меня есть что-то вроде следующего (псевдокод) на модели Container

scope :by_status, -> (statuses) do { 
    joins(papers:[:paper_statuses]).where('paper_statuses.tag in (?)', statuses) if statuses.present? 
} 

Возвращение, что я получаю все документы в контейнере, независимо от статуса .. однако странная часть все из статусы становятся тем, что я проходил, пока существует один. Что может вызвать это и как я могу предотвратить перезапись и загрузку всех документов в моем контейнере, если все, о чем я забочусь, это те, у которых есть определенные статусы?

ответ

0

Создав именованный объект на модели Container, вы всегда получите все Containers, содержащие как минимум один Paper с заданным статусом.

Но после того, как вы позвоните @containers.first.papers, вы получите все документы этого объекта Container независимо от их (документов) статусов. Это ожидаемое поведение. У меня похожая структура, и я не могу реплицировать замену статусов в своих объектах.

Чтобы убедиться, что происходит, используйте метод explain, чтобы показать ваш SQL-запрос. И, пожалуйста, вставьте код, который вы используете для сбора Container объектов и их Papers.

И, подумал, возможно, было бы лучше переместить именованный объект на модель Paper? Таким образом, вы можете собирать Papers с статусами вы заботитесь о с кодом:

Container.first.papers.by_status(statuses)

Я надеюсь, что мой ответ будет как-то помочь вам. Ура!