1

I have a model

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

  ...
end  

and the child

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

and am creating it through a form like so:

<% 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 %>   

The hidden fields are populated from a form on a page that this one is directed to from. This all works fine. My create method is as follows:

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

Everything gets created in the database just fine. However, the two models are not linked by the foreign key. In otherwords, the foreign key is never set in the child model. How do I remedy this? I have seen some people say this is a documented bug, but I have been unable to find this to be true anywhere. Thanks for any help.

1
  • note belongs_to :service_requests, :foreign_key => "wsi_web_inq_audits_uid_fk" is where the FK relationship for the ServiceRequest and Service types are supposed to be connecting. Just incase that wasn't clear from looking at the code. This is the column not getting set. Commented Nov 20, 2009 at 22:09

2 Answers 2

2

You need to provide the :foreign_key => "wsi_web_inq_audits_uid_fk" on the has_many in the ServiceRequest class as well. See the API Docs for all the available has_many parameters.

Sign up to request clarification or add additional context in comments.

2 Comments

is this for all has_many relationships? does it always need to be in both?
Rails makes some assumptions when it's not specified. For example, if you have a Comment model that belongs to a Post model you would need has_many :comments in your Post model and belongs_to :post in your Comment model. Rails expects the foreign key (in your comments table) to be post_id. It always assumes the singular word of the associated model.
1

Why is this plural?

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

1 Comment

Yeah that certainly won't help things either :) Should be belongs_to :service_request.....

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.