2011-01-06 12 views
1

Ruby 1.8.7-p249、Rails 2.3.8、SQLite3。外部キーをプログラムで定義するにはどうすればよいですか?

2つのテーブルをプログラムで作成し、それらの間に親子関係を定義したいと思います。 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は設定モデルよりも規約を使用しています。そのため、インボイステーブルの外部キー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以外の何かを(Railsのでは推奨されません)あなたの外部キーを命名した場合、のは、あなたがそのようなようなあなたのためのモデルの外部キーであることを指定することになり、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 
関連する問題