2009-11-20 4 views
1

J'ai un modèleaccepts_nested_attributes_for ne générant pas de clé étrangère

class ServiceRequest < ActiveRecord::Base 
    has_many :services 
    accepts_nested_attributes_for :services 

    ... 
end 

et l'enfant

class Service < ActiveRecord::Base 
    belongs_to :service_category, :foreign_key => "wsi_web_serv_cats_uid_fk" 
    belongs_to :service_type, :foreign_key => "wsi_web_serv_types_uid_fk" 
    belongs_to :service_subtype, :foreign_key => "wsi_web_srv_subtypes_uid_fk" 
    belongs_to :service_requests, :foreign_key => "wsi_web_inq_audits_uid_fk" 
end 

et je crée à travers une forme comme ceci:

<% form_for(@request, :url => { :action => :create }) do |form| %> 
    <table> 
     <tr> 
      <td><font style="font-weight: bold" color="red">*</font><b>First Name</b></td> 
      <td><b>Middle Initial</b></td> 
      <td><font style="font-weight: bold" color="red">*</font><b>Last Name</b></td> 
     </tr> 
     <tr> 
      <td><%= form.text_field :first_name %></td> 
      <td><%= form.text_field :win_middle_init, :size => "2" %></td> 
      <td><%= form.text_field :last_name %></td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <font style="font-weight: bold" color="red">*</font><b>Address 1</b><br/> 
       <%= form.text_field :address_1 %><br/> 
       <%= form.text_field :address_2 %> 
      </td> 
     </tr> 
     <tr> 
      <td><font style="font-weight: bold" color="red">*</font><b>City</b></td> 
      <td><font style="font-weight: bold" color="red">*</font><b>State</b></td> 
      <td><font style="font-weight: bold" color="red">*</font><b>Zip Code</b></td> 
     </tr> 
     <tr> 
      <td><%= form.text_field :municipality %></td> 
      <td><%= form.text_field :state, :size => "4" %></td> 
      <td><%= form.text_field :zip, :size => "9" %></td> 
     </tr> 
     <tr> 
      <td> 
       <font style="font-weight: bold" color="red">*</font><b>Phone Number</b><br/> 
       <%= form.text_field :day_phone %> 
      </td> 
     <tr/> 
     <tr> 
      <td> 
       <font style="font-weight: bold" color="red">*</font><b>Email</b><br/> 
       <%= form.text_field :email %> 
      </td> 
     <tr/> 
     <tr>    
      <td> 
       <font style="font-weight: bold" color="red">*</font><b>Confirm Email</b><br/> 
       <%= form.text_field :email_confirmation %> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <font style="font-weight: bold" color="red">*</font><b>Preferred Contact</b><br/> 
       <%= form.select "contact_method", options_for_select([["Phone", "PHN"], ["Email", "EML"], ["Phone or Email", "BTH"]]) %> 
      </td> 
     </tr> 
    </table> 

    <% form.fields_for :services do |fields| %> 
     <%= fields.hidden_field :wsi_web_serv_cats_uid_fk %> 
     <%= fields.hidden_field :wsi_web_serv_types_uid_fk %> 
     <%= fields.hidden_field :wsi_web_srv_subtypes_uid_fk %> 
    <% end %>   

    <p> 
     <%= form.submit "Create" %> 
    </p>    
<% end %> 

Les champs cachés sont peuplé à partir d'un formulaire sur une page à partir de laquelle celui-ci est dirigé. Tout cela fonctionne très bien. Ma méthode create est la suivante:

def create 
    service_request = ServiceRequest.new(params[:service_request]) 

    if service_request.save! 
     flash[:notice] = "Information submitted successfully. You will be contacted by a customer service representative regarding the services you selected." 
     redirect_to :controller => "customer", :action => "index" 
    else 
     flash[:notice] = "Error submitting info. Please try again." 
     redirect_to :back 
    end   
end 

Tout est créé correctement dans la base de données. Cependant, les deux modèles ne sont pas liés par la clé étrangère. En d'autres termes, la clé étrangère n'est jamais définie dans le modèle enfant. Comment puis-je remédier à cela? J'ai vu certaines personnes dire que c'est un bug documenté, mais j'ai été incapable de trouver cela vrai n'importe où. Merci pour toute aide.

+0

Note: 'belongs_to service_requests,: foreign_key => "wsi_web_inq_audits_uid_fk"' est où la relation FK pour la ServiceRequest et les types de services sont censés être connecter. Juste au cas où ce n'était pas clair de regarder le code. C'est la colonne qui ne se règle pas. – Lukas

Répondre

2

Vous devez également fournir le :foreign_key => "wsi_web_inq_audits_uid_fk" sur has_many dans la classe ServiceRequest. Voir le API Docs pour tous les paramètres has_many disponibles.

+0

est-ce pour toutes les relations has_many? Est-ce que ça doit toujours être dans les deux? – Lukas

+0

Rails fait certaines hypothèses lorsqu'il n'est pas spécifié. Par exemple, si vous avez un modèle Commentaire qui appartient à un modèle Post, vous aurez besoin de has_many: commentaires dans votre modèle Post et belongs_to: post dans votre modèle Comment. Rails s'attend à ce que la clé étrangère (dans votre table de commentaires) soit post_id. Il assume toujours le mot singulier du modèle associé. – bensie

1

Pourquoi est ce pluriel?

class Service < ActiveRecord::Base 
    ... 
    belongs_to :service_requests, :foreign_key => "wsi_web_inq_audits_uid_fk" 
end 
+0

Ouais ça ne va certainement pas aider les choses non plus :) Devrait être belongs_to: service_request ..... – bensie