嵌套属性的导轨形式

问题描述:

与范围有点挣扎。我有有电话号码轮廓模型:嵌套属性的导轨形式

has_many :phone_contact_infos, :dependent => :destroy 
accepts_nested_attributes_for :phone_contact_infos, :reject_if => :all_blank 

..then在我PhoneContactInfo模式,我有..

belongs_to :profile 
scope :business, where('level LIKE ?', 'business') 
scope :mobile, where('level = ?', 'mobile') 

所以基本上一个配置文件可以拥有移动和一个商务号码。我一直在尝试的做法是为每种类型的电话号码(业务和移动电话)编辑一个编辑表单。这是我这做了错误的事情..

<%= form_for @profile do |f| %> 
    <%= f.fields_for :phone_contact_infos do |contact_info| %> 
    <%= contact_info.text_field :country, :size => 2 %> 
    <%= contact_info.text_field :city, :size => 5 %> 
    <%= contact_info.text_field :number, :size => 8 %> 
    <% end %> 
<% end %> 

..since我有两个数据库条目(一个用于手机和其它业务)上面的代码中插入一个表格为每种类型的,所以我结束了用于商业和手机号码的文本字段。我只想编辑一个号码,比如手机。我想我需要在上面的代码中进行更改,以便在上面的PhoneContactInfo模型中定义范围。

谢谢!

以下是一种方法。

你可以改变has_many关系在您的个人资料模型,包括条件:

has_many :mobile_phone_contact_infos, :class_name => "PhoneContactInfo", :conditions => {:level => "mobile"}, :dependent => :destroy 
has_many :business_phone_contact_infos, :class_name => "PhoneContactInfo", :conditions => {:level => "business"}, :dependent => :destroy 

在你看来那么你可以使用:

<%= f.fields_for :mobile_phone_contact_infos do |contact_info| %> 

...它只会拔出手机联系,而不是商业号码。

有两点需要注意:

  1. 虽然你可以使用:conditions => {}条款(如where('level LIKE ?', 'business'))原始SQL条件下,你失去了一些功能。在我上面的代码中,如果你的profile.mobile_phone_contact_infos.build Rails会智能地为你填充'level'字段 - 但是如果你使用原始的SQL代码则不会。
  2. 我还没有测试过这个,过去我只在关联是多态时使用:conditions。我无法确认是否有必要使您的功能正常工作。

祝你好运!

+0

感谢抢劫,会试试这个。 – absolutskyy 2012-01-05 22:49:19