命名范围覆盖属性rails

时间:2016-05-18 03:18:16

标签: ruby-on-rails ruby activerecord

我有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?
}

我得到的回报是容器中的所有文件,无论状态如何。但是奇怪的部分是所有状态成为我传递的内容,只要存在。导致这种情况的原因是什么?如果我所关心的是那些具有特定状态的文件,我如何防止覆盖和加载我的容器对象中的所有文件?

1 个答案:

答案 0 :(得分:0)

通过在Container模型上创建命名范围,您将始终获得包含至少一个具有给定状态的Containers的所有Paper

但是在你致电@containers.first.papers之后,无论他们的(论文)状态如何,你都会收到Container个对象的所有论文。这是预期的行为。 我有类似的结构,我不能复制我的对象中的替换状态。

确保使用explain方法显示您的SQL查询。 请粘贴您用于收集Container个对象及其Papers

的代码

最后一想,也许将命名范围移到Paper模型会更好?这样,您可以使用代码收集Papers您关注的状态:

Container.first.papers.by_status(statuses)

我希望我的回答能以某种方式帮助你。干杯!