Rails - исключить указанный элемент c из массива - PullRequest
0 голосов
/ 08 января 2020

В моей модели есть метод, который возвращает массив с именем all_items Я пытаюсь отфильтровать элемент страхования, если продолжительность превышает 365 дней, как показано ниже:

  def available_items
    return all_items - [all_items.insurance] if duration >= 365

    all_items
  end

Но я Я все еще получаю страховку, даже если продолжительность больше 365. Протестировано в консоли, и страховка подходит как часть массива. Что я тут не так сделал?

Ответы [ 3 ]

1 голос
/ 08 января 2020

Похоже, что это не Array, а Relation и insurance - это область действия.

Так что вы можете сделать что-то вроде

all_items.where.not(name: 'insurance')
1 голос
/ 08 января 2020

Альтернативой является просто отрицание вашей области:

def available_items
   duration >= 365 ? Addition.where.not(id: Addition.insurance) : Addition.all
end

Хотя может быть более эффективно создать отрицательную область для вашей модели, например:

scope :not_insurance, -> { where.not(name: 'insurance' }

, а затем изменить available_items что-то вроде:

duration >= 365 ? Addition.not_insurance : Addition.all
1 голос
/ 08 января 2020

Addition:0x00007f8655402300 не совпадает с Addition:0x00007f86526cc728

Вы можете проверить name вместо всего объекта:

  def available_items
    return all_items.reject { |i| i[:name] == "insurance" } if duration >= 365

    all_items
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...