等效于before_save中没有查询的.where-Rails

时间:2019-01-10 23:46:52

标签: ruby-on-rails ruby ruby-on-rails-5

我有一个Invoice模型,其中accepts_nested_attributes_for :line_itemsallow_destroy: true。在我的模型中,在before_save回调中,我可以像这样引用数据:

self.line_items

某些项目在保存时将被删除。我希望只能抓取不会被删除的项目,像这样:

self.line_items.where(_destroy: false)

但是,由于我正在处理未保存的对象,因此这显然不起作用。因此,我的问题是如何获取不会被删除的项目列表?我知道我可以从技术上遍历该列表并将每个适用项添加到新数组中,但是我认为这里有些直观。例如,当前我使用.sort_by(&:line_number)而不是SQL .sort(:line_number)进行排序,这使我可以在内存中进行排序,而不是从SQL中进行排序。除了.where子句外,我还需要其他东西。

先谢谢了。

1 个答案:

答案 0 :(得分:3)

据我所知,where专门用于构建SQL查询,因此您不能使用它来处理内存中的条件,例如是否在保存时会破坏某些内容。为此,您可以使用Enumerable模块中的方法,该模块包含在集合对象中。您提到的sort_by调用正在使用该模块。在这种情况下,您可能会使用line_items.reject(&:marked_for_destruction?)。有关更多详细信息,请参见documentation for marked_for_destruction?