On Wednesday, 13 February 2013 15:41:49 UTC-5, Rafael C. de Almeida wrote:
>
> On Wednesday, February 13, 2013 12:59:11 PM UTC-2, Matt Jones wrote:
>>
>> On Tuesday, 12 February 2013 20:29:49 UTC-5, Rafael C. de Almeida wrote:
>>>
>>> Hello,
>>>
>>> Have you guys noticed that conditional validation with
>>> validates_associated does not work well when you are creating a new record?
>>>
>>> Consider this gist: https://gist.github.com/aflag/4780225
>>>
>>> The Lawyer class has validates_associated on address conditioned on
>>> whether the Lawyer data comes from a known source or not. So, if
>>> lawyer.source equals to some string, then lawyer.address must not be
>>> validated. However, if I'm trying to create a new record, it is validated
>>> regardless of whether source is nil or not. Is it expected to behave like
>>> that? Is that a bug?
>>>
>>>
>> The behavior is intentional, though perhaps not documented as well as it
>> should be. It has to do with the autosave behavior for has_many on new
>> records - the part that enables you to build a new record, add some unsaved
>> child records (phones, etc in your example) and then save the parent object
>> and get all the others saved as well.
>>
>
> I see. Thank you for the clarification. However, isn't that behavior
> counter-intuitive? Why should "valid?" return a different thing depending
> on whether a nested model is saved or not? If you want to skip the
> validation of one nested model, but still validate other things, then your
> only option is doing something like:
>
Better option: don't save records to the DB that are invalid. That's
typically considered a bad thing, so Rails makes it hard to do.
I'd recommend extending the "extracted?" method into your related models:
class Lawyer < ActiveRecord::Base
has_many :phones, :inverse_of => :lawyer
...
end
class Phone < ActiveRecord::Base
belongs_to :lawyer, :inverse_of => :phones
validates_something_of :foo, :if => :extracted?
def extracted?
lawyer.extracted?
end
end
This has the advantage of making the validations you want to skip
*explicit* (they get the :if => :extracted? condition) instead of just
skipping them entirely when needed.
--Matt Jones
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msg/rubyonrails-talk/-/NGBWs-KCY3sJ.
For more options, visit https://groups.google.com/groups/opt_out.