2011-01-06 6 views
1

Ruby 1.8.7-p249, Rails 2.3.8, SQLite3.Comment définir une clé étrangère par programme?

Je voudrais créer 2 tables par programme et définir la relation parent-enfant entre elles. La méthode foreign_key fonctionne dans les migrations db mais elle ne fonctionne pas dans mon code dans le bloc ActiveRecord :: Schema.define.

Comment créer une clé étrangère par programme?

code:

# 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 

Erreur:

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

Quelle est cette méthode? À ma connaissance, il n'y a pas de support pour la création de clés étrangères. – Heikki

+1

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

Répondre

0

Vous êtes déjà la plupart du chemin, puisque vous avez utilisé la convention de [parent_table_name] _id pour la clé étrangère (bon travail!). Rails utilise la convention sur le modèle de configuration. Ainsi, puisque vous avez choisi de nommer votre clé étrangère order_id dans votre table de factures, Rails calculera automatiquement que order_id est la clé étrangère de la clé primaire order.id. Tout ce que vous devez faire est de spécifier dans vos modèles les attributs has_many et 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 

Note: Si vous avez nommé votre clé étrangère dans la table quelque chose de factures en plus order_id (non recommandé dans Rails), disons schmorder_id, alors vous préciser qu'il est la clé étrangère dans votre modèle d'ordre comme tel:

/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 
Questions connexes