wake-up-neo.com

Definieren von Fremdschlüsselbeziehungen für Rails-Modelle

Ich habe eine Comment-Klasse mit einem: foreign_key von post_id in der Post-Klasse.

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

Meine CreateComments-Migration definiert jedoch keinen Fremdschlüssel auf Datenbankebene:

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

Stattdessen ist post_id eine einfache Ganzzahlspalte.

Es scheint also, dass diese Fremdschlüsselbeziehung nur in den Köpfen von Rails existiert, nicht auf Datenbankebene.

Ist das richtig?

Ist es auch erforderlich, dass das entsprechende Post-Modell seine wechselseitige Fremdschlüsselbeziehung zu Comments mit dem Attribut: foreign_key deklariert oder könnte dies weggelassen werden?

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

Das Rails Standardverhalten ist, dass die Spalte, in der der Fremdschlüssel in einem Modell gespeichert ist, der Name der Zuordnung mit dem hinzugefügten Suffix _id Ist. Das :foreign_key Mit dieser Option können Sie den Namen des Fremdschlüssels direkt festlegen. Die Zuordnungen zwischen den Modellklassen Post und Comment sollten folgendermaßen aussehen:

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

- Beachten Sie, dass Sie :class_name => "Post" In Ihrem Comment Modell nicht benötigen. Rails enthält diese Informationen bereits. Sie sollten nur :class_name Und :foreign_key Angeben, wenn Sie die Rails-Konventionen außer Kraft setzen müssen.

Sie haben Recht, dass Rails die Fremdschlüsselbeziehungen für Sie verwaltet. Sie können diese in der Datenbankebene erzwingen, wenn Sie möchten, indem Sie Fremdschlüsseleinschränkungen hinzufügen.

75
John Topley