2009-05-24 20 views
48

Post sınıfında post_id adlı bir yabancı ile bir Yorum sınıfına sahibim.Rails modelleri için yabancı anahtar ilişkilerini tanımlama

class Comment < ActiveRecord::Base 
    belongs_to :post, :class_name => "Post", :foreign_key => "post_id", :counter_cache => true 
    belongs_to :author, :class_name => "User", :foreign_key => "author_id" 
end 

Ama bir veritabanı düzeyinde yabancı anahtarı tanımlamak değil benim CreateComments göç:

class CreateComments < ActiveRecord::Migration 
    def self.up 
    create_table :comments do |t| 
     t.column "post_id",  :integer, :default => 0, :null => false 
     t.column "author",  :string, :default => "", :limit => 25, :null => false 
     t.column "author_email", :string, :default => "", :limit => 50, :null => false 
     t.column "content",  :text,  :null => false 
     t.column "status",  :string, :default => "", :limit => 25, :null => false 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :comments 
    end 
end 

yerine Post_id basit tamsayı sütundur.

Dolayısıyla, bu yabancı anahtar ilişkisinin sadece veritabanı seviyesinde değil, Rails'in aklında olduğu görülmektedir.

Bu doğru mu?

Ayrıca, ilgili Post modelinin yabancı yabancı anahtar ilişkisini de açıklamaları için: foreign_key özniteliğini kullanarak yorumlanması gerekir mi yoksa atlanamaz mı?

class Post < ActiveRecord::Base 
    set_table_name("blog_posts") 
    belongs_to :author, :class_name => "User", :foreign_key => 'author_id' 
    has_many :comments, :class_name => "Comment", 
    :foreign_key => 'post_id', :order => "created_at desc", :dependent => :destroy 
    has_many :categorizations 
    has_many :categories, :through => :categorizations 
    named_scope :recent, :order => "created_at desc", :limit => 5 

end 
+0

Rails'in SQL anahtarını kullanmadığı konusundaki sürprizinizi paylaşıyorum. DB'lerdeki ray dışı araçların kullanılmasını zorlaştırır. – Greg

+2

Raylar, "TÜM iş mantığı uygulamada tanımlanmalıdır" kuralını izler ... böylece DB'yi yalnızca "dilsiz" bir depolama alanı olarak kullanır. Yabancı anahtar yok, saklı yordam yok, kısıtlama yok (örneğin, postgre'lerde desteklenir). DÜZENLEME: Sadece bu aynı cevabı buldu - http://stackoverflow.com/questions/8334602/need-to-create-a-foreign-key-when-creating-a-table-on-rails –

+1

https://github.com/matthuhiggins/foreigner – wberry

cevap

69

Raylar varsayılan davranış bir model üzerinde dış anahtar tutmak için kullanılan kolon _id ilave eki ile birlikte adı olmasıdır. :foreign_key seçeneği, yabancı anahtarın adını doğrudan ayarlamanıza izin verir. senin Post ve Comment modeli sınıflar arasındaki dernekler gibi görünmelidir: Eğer Comment modelinde :class_name => "Post" gerekmez

class Post < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
end 

— Not. Raylar zaten bu bilgilere sahip. Rails'in kurallarını geçersiz kılmanız gerektiğinde sadece :class_name ve :foreign_key belirtilmelidir.

Rails'in sizin için yabancı anahtar ilişkilerini sürdürdüğü konusunda haklısınız. Yabancı anahtar kısıtlamaları ekleyerek, bunları veritabanı katmanında zorlayabilirsiniz.

+0

foreign_key bağlantısı veritabanı düzeyinde ve sadece raylarda olmadığından. Bir kayıt postadan silindiyse, ilgili satırındaki yorum da silinecek mi? Yabancı bir tuşa basmanın bir başka faydası da budur. Bu yardımı alacağım mı? –

+0

İlgili sütunu da silmek isterseniz. Dernek yazdığınız satırın sonuna 'depend: destroy' eklemeniz gerekir. – Lavika