Как запустить проверки на производные значения для новых объектов?

У меня есть модель, которая имеет несколько атрибутов, которые предоставляются при создании. Модель также имеет некоторые дополнительные атрибуты, которые получены из предоставленных атрибутов, которые я также хочу рассчитать при создании. Более проблематично, я хочу иметь возможность запускать проверки на эти производные значения (поскольку есть входы, которые являются действительными сами по себе, что приводит к недопустимым производным значениям).

Проблема в том, что когда я это делаю:

class MyClass < ActiveRecord::Base
  attr_accessible :given1, :given2, :derived

  before_validation :derivation
  validates_uniqueness_of :derived

  def derivation
    self.derived = self.given1 + self.given2
  end
end

MyClass.new(:given1 => aNumber, :given2 => otherNumber)

I always get errors saying I can't add nil to nil. Apparently self.attribute is nil until farther into the validation & creation process.

Очевидно, что я мог бы установить свои производные значения на более позднем этапе и добавить пользовательскую проверку, которая работает с данными атрибутами, но это повлечет за собой выполнение деривации дважды, что не будет очень сухим.

Есть ли другой способ получить назначенные, но еще не проверенные атрибуты на этапе before_validates ?

Edit: To clarify, I want to call MyClass.new(:given1 => aNumber, :given2 => otherNumber) and have the derived value calculated before the validations check, so that the validations check as if I had called MyClass.new(:given1 => aNumber, :given2 => otherNumber, :derived => aNumber + otherNumber). The problem is that I can't seem to access the passed-in values for :given1 and :given2 in a before_validations method.

1
nl ja de
Виноват. Я запутался в attr_accessible с помощью attr_accessor. Документация attr_accessible является новой с Rails 3.2, и я не знаком с ней. Я удалю свои плохие комментарии.
добавлено автор Marlin Pierce, источник
Звучит как работа для настраиваемого валидатора
добавлено автор mccannf, источник
Я не совсем уверен, что вы просите быть честным. Что именно вы используете для установки значений given1 и given2. Я напишу небольшое объяснение относительно того, что делает attr_accessible, и если вам нужна дополнительная помощь, просто комментируйте, и я отредактирую по мере необходимости.
добавлено автор Leo Correa, источник
Я написал свой собственный небольшой фрагмент кода, который в значительной степени делает то же самое, что вы делаете, но с пользователем, и он работает отлично. Какова именно ошибка, которую вы получаете? Вы назначаете aNumber и otherNumber ?
добавлено автор Leo Correa, источник
@LeoCorrea: Я запускаю MyClass.new (: given1 => aNumber,: given2 => otherNumber) , и я хочу, чтобы проверки выполнялись на : given1 => aNumber,: given2 => otherNumber,: производный => aNumber + otherNumber . Кроме того, конечно, мой вывод более сложный, чем просто добавление двух чисел вместе. Вся привлекательная сделка - это побочный вопрос, возникший у Марлина, незнакомого с 3.2; это не имеет никакого отношения к моему вопросу.
добавлено автор Oblivious Sage, источник

1 ответы

Я написал собственный фрагмент кода, который выглядит так:

class User < ActiveRecord::Base
  attr_accessible :email, :first_name, :last_name

  validates :email, uniqueness: true

  before_validation :derivation

  def derivation
    self.email = self.first_name + self.last_name
  end
end

Выполнение следующего не привело к ошибкам:

»  u = User.new first_name: "leo", last_name: "correa"
=> # {
                      :id => nil,
              :first_name => "leo",
               :last_name => "correa",
                   :email => nil,
              :created_at => nil,
              :updated_at => nil,
}
»  u.valid?
  User Exists (0.9ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = 'leocorrea' LIMIT 1
=> true

Running u.save saved the record successfully and upon repeating the User.new and saving that new record it returned with ROLLBACK because email was already used.

In any case, make sure you are assigning whatever variables you are using to the given1, given2 and whatever the result is make sure is not giving you false either because it will cancel the before_validate callback and the record won't save.

1
добавлено
О чем ты говоришь? Я вижу, что электронная почта nil, когда я сначала вызываю new , но first_name и last_name устанавливаются с переданными значениями. Как только я вызываю valid? , он запускает before_validation и назначает электронную почту.
добавлено автор Leo Correa, источник
В противном случае, если first_name и last_name были nil, я бы получил ошибку вместо true
добавлено автор Leo Correa, источник
Можете ли вы отправить точную команду, которую вы используете, с жестко закодированными значениями? Вы уверены, что значения, которые вы передаете, устанавливаются?
добавлено автор Leo Correa, источник
Лео, обратите внимание, в вашем примере, что электронная почта равна нулю; когда вызывается вывод, он видит self.first_name & self.last_name как ноль, а не значения, которые вы передали ему. Это моя проблема.
добавлено автор Oblivious Sage, источник
Хмммм, я вижу. Я вызываю некоторые методы для моих значений (value.floor и т. Д.), И я продолжаю получать ошибку, которую я не могу назвать этим методом на nil.
добавлено автор Oblivious Sage, источник
Ничего, я идиот. Это было неудачно на нескольких тестах, где я сознательно не проходил 1 или более данных значений.
добавлено автор Oblivious Sage, источник
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff