Rails形成嵌套属性

时间:2012-01-04 22:06:30

标签: ruby-on-rails

稍微挣扎范围。我有一个个人资料模型,其中包含电话号码:

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

..然后在我的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 %>

..因为我有两个数据库条目(一个用于移动设备,另一个用于商业用途),上面的代码为每种类型插入一个表单,所以我最终得到了商业和移动号码的文本字段。我只想编辑一个号码,比如说移动号码。我想我需要对上面的代码进行更改,以便于上面的PhoneContactInfo模型中定义的范围。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是一种方法。

您可以更改个人资料模型中的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 => {}子句中使用原始SQL条件(例如where('level LIKE ?', 'business')),但您会失去一些功能。在我上面的代码中,Rails将智能地填充“&#39;级别”。如果你profile.mobile_phone_contact_infos.build,你可以使用该字段 - 但如果使用原始SQL代码则不会。
  2. 我还没有对此进行过测试,过去我只在关联是多态的情况下才使用:conditions。我无法确认是否有必要让您的功能正常运行。
  3. 祝你好运!