Ответ 1
Попробуйте следующее:
([model1, model2].map(&:valid?)).all?
Он вернет true, если оба они действительны, и создайте ошибки для обоих экземпляров.
Я работаю с Ruby on Rails и хотел бы проверить две разные модели:
if (model1.valid? && model2.valid?)
...
end
Однако "& &" оператор использует оценку короткого замыкания (т.е. оценивает "model2.valid?", только если "model1.valid?" истинно), что предотвращает выполнение model2.valids, если модель1 недействительна.
Есть ли эквивалент "& &" который не будет использовать оценку короткого замыкания? Мне нужны два выражения для оценки.
Попробуйте следующее:
([model1, model2].map(&:valid?)).all?
Он вернет true, если оба они действительны, и создайте ошибки для обоих экземпляров.
& отлично работает.
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
Как насчет:
if [model1.valid?,model2.valid?].all?
...
end
Работает для меня.
Оцените их отдельно и сохраните результат в переменной. Затем используйте простой && между этими булерами:)
Вместо создания дополнительного массива с картой вы можете передать блок all?
.
[model_instance_1, model_instance_2].all? {|i| i.valid? }