2011-01-06 8 views
1

Ruby 1.8.7-p249, Rails 2.3.8, SQLite3.프로그래밍 방식으로 외래 키를 정의하는 방법은 무엇입니까?

저는 두 개의 테이블을 프로그램 적으로 만들고 부모 - 자식 관계를 정의하고 싶습니다. foreign_key 메서드는 db 마이그레이션에서 작동하지만 ActiveRecord :: Schema.define 블록의 코드에서는 작동하지 않습니다.

프로그래밍 방식으로 외래 키를 어떻게 만듭니 까?

코드 :

# To change this template, choose Tools | Templates 
# and open the template in the editor. 

require "rubygems" 
require "active_record" 
require "logger" 
require "pp" 

ActiveRecord::Base.logger = Logger.new($stdout) 

ActiveRecord::Base.establish_connection(
    :adapter => "sqlite3", 
    :database => "../db/development_mp.sqlite3" 
) 

ActiveRecord::Schema.define do 
    create_table :orders, :force => true do |t| 
    t.string :name 

    t.timestamps 
    end 

    create_table :invoices, :force => true do |t|  
    t.integer :order_id 

    t.timestamps 
    end 

    # Error! 
    foreign_key(:invoices, :order_id, :orders) 
end 

오류 :

-- foreign_key(:invoices, :order_id, :orders) D:/Ruby/bitnami-rubystack-2.1-0/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/migration.rb:352:in `send': undefined method `foreign_key' for 
     #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x554f2f8> (NoMethodError) 
       from D:/Ruby/bitnami-rubystack-2.1-0/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/migration.rb:352:in `method_missing' 
       from D:/Ruby/bitnami-rubystack-2.1-0/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/migration.rb:328:in `say_with_time' 
       from D:/Ruby/bitnami-rubystack-2.1-0/ruby/lib/ruby/1.8/benchmark.rb:293:in `measure' 
       from D:/Ruby/bitnami-rubystack-2.1-0/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/migration.rb:328:in `say_with_time' 
       from D:/Ruby/bitnami-rubystack-2.1-0/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/migration.rb:348:in `method_missing' 
       from D:/prg/Ruby/Pragmatic.Agile-Web-Development-With-Rails-Third-Edition/active_record_basics/lib/has_one_mp.rb:29 
       from D:/Ruby/bitnami-rubystack-2.1-0/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/schema.rb:47:in `instance_eval' 
       from D:/Ruby/bitnami-rubystack-2.1-0/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/schema.rb:47:in `define' 
       from D:/prg/Ruby/Pragmatic.Agile-Web-Development-With-Rails-Third-Edition/active_record_basics/lib/has_one_mp.rb:16 
+0

어떤 방법입니까? 내 지식을 외래 키를 만들기위한 지원이 내장되어 있지 않습니다. – Heikki

+1

http://stackoverflow.com/questions/4609898/foreign-keys-in-rails-3/4609970#4609970 – Heikki

답변

0

당신이있어 이미 대부분의 방법, 당신은 외래 키 (선한 일을 [parent_table_name] _id의 규칙을 사용하기 때문에!). Rails는 컨벤션 오버 모델을 사용하기 때문에 invoices 테이블에서 외래 키 order_id의 이름을 지정하기 때문에 Rails는 order_id가 order.id 기본 키의 외래 키임을 자동으로 파악합니다. 모델에서 has_many 및 belongs_to 속성을 지정하기 만하면됩니다.

/app/models/order.rb 

class Order < ActiveRecord::Base 

    has_many :invoices 

end 


---------- 


/app/models/invoice.rb 

class Invoice < ActiveRecord::Base 

    belongs_to :order 

end 

참고 : (레일에서 권장하지 않음) ORDER_ID 외에 송장 테이블 뭔가에 외래 키 이름이 경우의이 schmorder_id는, 당신은이 같은 같은 주문 모델에서 외래 키 지정 것이라고 가정 해 봅시다 :

/app/models/order.rb 

class Order < ActiveRecord::Base 

    #if the foreign_key in your invoices table was named schmorder_id... 
    has_many :invoices, :foreign_key => "schmorder_id" 

end 
관련 문제