Problem saving parent and children using belongs_to, class_name, and foreign_key

5 views
Skip to first unread message

jsc...@gmail.com

unread,
Dec 7, 2006, 6:38:26 PM12/7/06
to Ruby on Rails: Talk
Hi, I have a real simple association setup here that's just trying to:
- Create a new PayjunctionOrder
- Create some LineItem objects and assign them to the PayjunctionOrder
- Save everything

I'm using Rails Edge.

----
class PayjunctionOrder < ActiveRecord::Base
has_many :line_items

end
------------------

----
class LineItem < ActiveRecord::Base
belongs_to :order,
:class_name => "PayjunctionOrder",
:foreign_key => "order_id"
...
------------------

----
class StoreController < ApplicationController

def checkout_complete
...
@order = PayjunctionOrder.new
@order.line_items << LineItem.new(:product => product, :quantity =>
qty, :total_price => product.price * qty)

@order.save!
...
------------------

When I try to save, I get:

Mysql::Error: #23000Column 'order_id' cannot be null: INSERT INTO
line_items (`order_id`, `total_price`, `product_id`, `quantity`)
VALUES(NULL, '285.0', 5, 1)

The development.log shows the insert being done for the
PayjunctionOrder, but the inserts for the children fail on this NOT
NULL constraint. So for whatever reason, order_id isn't being set in
the children.

What's weird is that it will work just fine (as advertised) by renaming
the column "order_id" to "payjunction_order_id" in the line_items table
and doing this instead:

----
class LineItem < ActiveRecord::Base
belongs_to :payjunction_order
...
------------------


However, this isn't an optimal solution.

So it seems like maybe Rails is ignoring the :class_name and
:foreign_key options in belongs_to. Does anyone have any insight as to
whats going on here? Thanks for the help.

jsc...@gmail.com

unread,
Dec 7, 2006, 6:48:06 PM12/7/06
to Ruby on Rails: Talk
Here are the table schemas for reference:

create_table "line_items", :force => true do |t|
t.column "product_id", :integer,
:default => 0, :null => false
t.column "order_id", :integer,
:default => 0, :null => false
t.column "quantity", :integer,
:default => 0, :null => false
t.column "total_price", :decimal, :precision => 8, :scale => 2,
:default => 0.0, :null => false
end

create_table "payjunction_orders", :force => true do |t|
t.column "total_amount", :decimal, :precision => 8, :scale =>
2, :default => 0.0, :null => false
t.column "response_code", :string, :limit => 5, :default => "",
:null => false
t.column "response_message", :string
t.column "tracking_code", :string, :limit => 15
t.column "cc_last_four", :string, :limit => 22
t.column "first_name", :string, :limit => 30
t.column "last_name", :string, :limit => 20
t.column "email", :string, :limit => 30
end

Jason Schock

unread,
Dec 8, 2006, 2:03:32 AM12/8/06
to Ruby on Rails: Talk
I finally got this sorted, so here's the solution for anyone else with
this problem.

Seems that the parent class also needs to know what the foreign key is
called in the child. So, you'd need the following:

----
class PayjunctionOrder < ActiveRecord::Base

has_many :line_items, :foreign_key => "order_id"

end
------------------


I guess it makes sense, but it seems kinda redundant to me. Also, it's
not explicitly mentioned in the docs from what I could see; I really
think it needs to be. Nudge-nudge to the Rails Gods.

Reply all
Reply to author
Forward
0 new messages