【问题标题】:Polymorphic association with validation [Is it even possible ??]与验证的多态关联[甚至可能吗??]
【发布时间】:2012-05-28 07:35:22
【问题描述】:

我想知道我是否可以拥有多态关联以及存在验证

假设我有一个business 模型和一个address 模型,而address 是多态的

class Business< ActiveRecord::Base
  has_one :address, as: :addressable
  validates_presence_of :address
end

class Address< ActiveRecord::Base
  belongs_to :addressable, polymorphic: true
end

是否可以进行验证validates_presence_of :address?使用此设置创建对象时遇到问题。

假设首先我创建了一个这样的业务对象

b = Business.new(name: "Hello23")
b.address = Address.new(street: "House 43 BCD")
b.save!

这不起作用。它给出了一个undefined method constantize for 0:Fixnum 并且给出一个错误是有意义的,因为当它试图将地址保存到 db 时,它没有找到可寻址的 id,因为业务尚未保存并且没有分配识别它。

但从另一边也不可能 - 如果没有地址,我无法保存业务。

处理这种情况的最佳方法是什么?

****除此之外,如果我还想像这样在地址端进行验证怎么办**

validates_presence_of :addressable

我已经为此苦苦挣扎了大约 2 天。让我们看看你们有什么想法?**

【问题讨论】:

    标签: ruby-on-rails-3 validation activerecord


    【解决方案1】:

    我认为您的问题与验证码无关,无论哪种方式都可以。

    我能否大胆地建议您可能错误地将地址数据库表中的 addressable_type 列设置为整数,而不是字符串:)

    【讨论】:

    • 这不是列类型的问题,但您对验证代码正确的信心帮助我思考“还有什么可能是错误的”,我终于想通了。谢谢朋友
    • 天哪,你是该死的正确的人。今天在处理这段代码大约一周之后。我被另一个奇怪的错误震惊了,只是意识到你是对的,我错误地在地址中设置了 addressable_type 列表到整数而不是字符串。刚回来留下这个评论,再次感谢你:)。
    【解决方案2】:

    当然可以。

    至于对象创建,这应该可行:

    # controller.rb
    @business = Business.new
    @business.build_address
    
    # view.erb
    <%= form_for @business do |f| %>
      <%= f.fields_for :address do |address_form| %>
      ...
      <% end %>
    <% end %>
    

    另见Using build with a has_one association in rails

    注意:在您的模型中,我建议您使用新的验证格式:

    class Business< ActiveRecord::Base
      has_one :address, as: => :addressable
    
      validates :address, :presence => true
    end
    

    希望这会有所帮助。

    【讨论】:

    • 我意识到我做错了很多,你写的构建方法提示我寻找正确的方向。我现在对如何构建和保存 activerecord 对象有了更好的理解。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2012-02-19
    • 2014-11-21
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多