我有Container
的模型,其has_and_belongs_to_many Papers
has_one Status
。
我希望在Container
模型上有一个命名范围,它将为我提供仅填充包含特定状态集的文件的所有容器。
我在Container模型上有类似下面的内容(伪代码)
scope :by_status, -> (statuses) do {
joins(papers:[:paper_statuses]).where('paper_statuses.tag in (?)', statuses) if statuses.present?
}
我得到的回报是容器中的所有文件,无论状态如何。但是奇怪的部分是所有状态成为我传递的内容,只要存在。导致这种情况的原因是什么?如果我所关心的是那些具有特定状态的文件,我如何防止覆盖和加载我的容器对象中的所有文件?
答案 0 :(得分:0)
通过在Container
模型上创建命名范围,您将始终获得包含至少一个具有给定状态的Containers
的所有Paper
。
但是在你致电@containers.first.papers
之后,无论他们的(论文)状态如何,你都会收到Container
个对象的所有论文。这是预期的行为。
我有类似的结构,我不能复制我的对象中的替换状态。
确保使用explain
方法显示您的SQL查询。
请粘贴您用于收集Container
个对象及其Papers
。
最后一想,也许将命名范围移到Paper
模型会更好?这样,您可以使用代码收集Papers
您关注的状态:
Container.first.papers.by_status(statuses)
我希望我的回答能以某种方式帮助你。干杯!