Подтвердить что ты не робот

Как избежать оценки короткого замыкания на

Я работаю с Ruby on Rails и хотел бы проверить две разные модели:

if (model1.valid? && model2.valid?)
...
end

Однако "& &" оператор использует оценку короткого замыкания (т.е. оценивает "model2.valid?", только если "model1.valid?" истинно), что предотвращает выполнение model2.valids, если модель1 недействительна.

Есть ли эквивалент "& &" который не будет использовать оценку короткого замыкания? Мне нужны два выражения для оценки.

4b9b3361

Ответ 1

Попробуйте следующее:

([model1, model2].map(&:valid?)).all?

Он вернет true, если оба они действительны, и создайте ошибки для обоих экземпляров.

Ответ 2

& отлично работает.

irb(main):007:0> def a
irb(main):008:1> puts "a"
irb(main):009:1> false
irb(main):010:1> end
=> nil

irb(main):011:0> def b
irb(main):012:1> puts "b"
irb(main):013:1> true
irb(main):014:1> end
=> nil

irb(main):015:0> a && b
a
=> false

irb(main):016:0> a & b
a
b
=> false

irb(main):017:0> a and b
a
=> false

Ответ 3

Как насчет:

if [model1.valid?,model2.valid?].all?
  ...
end

Работает для меня.

Ответ 4

Оцените их отдельно и сохраните результат в переменной. Затем используйте простой && между этими булерами:)

Ответ 5

Вместо создания дополнительного массива с картой вы можете передать блок all?.

[model_instance_1, model_instance_2].all? {|i| i.valid? }