【问题标题】:How to design model with two, independent and optional relations to the same model?如何设计具有两个独立和可选关系的模型到同一个模型?
【发布时间】:2011-09-29 12:38:14
【问题描述】:

我在设计User 模型并为其制作体面的形式时遇到了问题。我只是想确保自己做错了:) 所以它是这样的:

User 有两个Addresses:

  • 一个强制性的Address 用于识别和计费,
  • 他可以填写或留空的可选运费Address

我试过这样:

class User < ActiveRecord::Base
  has_one :address
  has_one :shipping_address, :class_name => 'Address', :foreign_key => 'shipping_address_id'
  accepts_nested_attributes_for :address
  accepts_nested_attributes_for :shipping_address
  #validations for user
end

和:

class Address < ActiveRecord::Base
  #validations for address
end

然后我使用form_for 和嵌套fields_forUser 创建一个表单。像这样:

= form_for @user, :url => '...' do |a|
  = f.error_messages
  ...
    = fields_for :address, @user.build_address do |a|
      ...

但是,尽管f.error_messages 为所有模型生成错误,Addresses 的字段在错误时不会突出显示。

当用户选择不填写第二个地址时,我在禁用第二个地址验证时遇到问题。

我怀疑我的方法是否正确。我的意思是has_one 关系和这个装置的整体设计。

那么问题来了:

我做错了吗?你会如何代替我这样做?

【问题讨论】:

  • 我会在 User 中使用 belongs_to 关联,但随后表单会爆炸!
  • 外键存储在哪里?如果useraddress_idshipping_address_id 它应该是belongs_to 否则has_one(和地址belongs_to 用户)。
  • User 中使用has_one 后,ActiveRecord 想要地址中的shipping_address_idaddress_id!所以我把它们放在那里。我知道这不是最好的主意,而且现在整个关系有点颠倒了。

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord nested-forms


【解决方案1】:

您的表单中的错误在于,它会在每次呈现视图时构建一个新地址,从而丢失所有验证错误。

在您的控制器中,在 new 操作中,您应该执行类似的操作

@user.build_address

在你看来写:

= fields_for :address, @user.address do |a|

希望这会有所帮助。

【讨论】:

  • 谢谢!有效。但是现在有一个东西是在shipping地址验证没有填写的时候禁用。
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 2018-12-29
  • 2013-05-30
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多