Rails 更新从数组属性中删除数字?

Rails update remove number from an array attribute?

有没有办法在更新中从属性数组中删除一个数字?例如,如果我想在 alchy 用完特定类型的酒后更新他的所有酒藏:

Alchy has_many :stashes

Stash.available_booze_types = [] (filled with booze.ids)

Booze is also a class

@booze.id = 7

if @booze.is_all_gone
  @alchy.stashes.update(available_booze_types: "remove @booze.id")
end

更新:@booze.id 可能存在也可能不存在于 available_booze_types 数组中

... 所以如果@booze.id 在任何 Alchy.stash 实例中(在 available_booze_types 属性数组中),它将被删除。

我想你可以通过以下方式做你想做的事:

if @booze.is_all_gone
  @alchy.stashes.each do |stash|
    stash.available_booze_types.delete(@booze.id)
  end
end

但是,在我看来,有更好的方法可以完成您想要做的事情。 Rails 通过使用关系为您提供类似于该数组的内容。此外,如果您重置应用程序,数组中的数据将丢失(如果据我了解 available_booze_types 是未存储在数据库中的属性)。如果您的应用程序设置正确(一个藏有很多酒),那么 Stash class 中的范围在我看来是正确的方法:

scope :available_boozes, -> { joins(:boozes).where("number > ?", 0) }

您可以通过以下方式使用:

@alchy.stashes.available_boozes

这只会 return 可用的。