Как защитить атрибут модели Rails?

Вам нужна другая переменная found и установите ее на true, если набор данных найден. Тогда не помещайте фактический набор данных в массив.

По сути, вам необходимо посетить все элементы и в конце решить, добавите ли вы объект в массив.

С вашим кодом вы выполняете хотя бы одно действие, либо обновляете фактический конец набора данных, который работает, только если требуемый name находится в первом элементе, или вы помещаете объект в массив. Это происходит до тех пор, пока не будет найден требуемый набор данных или больше не будет доступных элементов.

const arr = [{ name: 'first', amount: 2 }, { name: 'second', amount: 1 }, { name: 'third', amount: 1 }];
const obj = { name: 'second', amount: 3 };

var found = false;

for (let i = 0; i < arr.length; i++) {
    if (arr[i].name === obj.name) {
        arr[i].amount += obj.amount;
        found = true;
        break;
    }
}

if (!found) {
    arr.push(obj);
}

console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }

12
задан Christoph Schiessl 21 October 2008 в 19:51
поделиться

2 ответа

Вы хотите attr_readonly.

21
ответ дан 2 December 2019 в 06:28
поделиться

Не настолько симпатичный, как один лайнер, но код ниже должен работать (и Вы могли всегда делать некоторое метапрограммирование для записи 'неизменного' метода),

def address_id=(id)
  if new_record?
    write_attribute(:address_id, id)
  else
    raise 'address is immutable!'
  end
end 
3
ответ дан 2 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: