首页 > 解决方案 > Rails更新从数组属性中删除数字?

问题描述

有没有办法在更新中从属性数组中删除一个数字?例如,如果我想在某个特定类型的酒用完时更新一个 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 属性数组中),它将被删除。

标签: arraysrubydestroy

解决方案


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

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

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

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

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

@alchy.stashes.available_boozes

这只会返回可用的那些。


推荐阅读