Обновление Rails удаляет номер из атрибута массива? - PullRequest
0 голосов
/ 06 мая 2020

Есть ли способ удалить число из массива атрибутов в обновлении? Например, если я хочу обновить все тайники выпивки алхи, если у него закончился конкретный тип выпивки:

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

update: @ booze.id может присутствовать или не присутствовать в массиве available_booze_types

... так что, если @ booze.id был в любом из экземпляров Alchy.sta sh (в массиве атрибутов available_booze_types), он был бы удален.

1 Ответ

1 голос
/ 06 мая 2020

Я думаю, вы можете делать то, что хотите, следующим образом:

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

Однако мне кажется, что есть более эффективные способы делать то, что вы пытаетесь сделать. Rails дает вам что-то вроде этого массива, используя отношения. Кроме того, данные в массиве будут потеряны, если вы сбросите приложение (если, как я понимаю, available_booze_types - это атрибут, который не хранится в базе данных). Если ваше приложение настроено правильно (sta sh имеет много выпивки), область видимости, подобная следующей в классе Stash, кажется мне правильной:

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

Вы можете использовать ее в следующим образом:

@alchy.stashes.available_boozes

, который вернет только те, которые доступны.

...