53 votes

Définition des relations de clé étrangère pour les modèles de Rails

J'ai un Commentaire catégorie :foreign_key de post_id dans le Post de la classe.

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

Mais mon CreateComments la migration ne permet pas de définir une base de données au niveau de la clé étrangère:

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

Au lieu de cela post_id est une simple colonne de type Integer.

Donc, il semble que cette relation de clé étrangère n'existe que dans l'esprit de Rails, pas au niveau base de données.

Est-ce correct?

Aussi, est-il nécessaire pour le Poste correspondant de modèle pour aussi déclarer sa réciproque relation de clé étrangère avec des Commentaires à l'aide de l' :foreign_key attribut ou peut-être omis?

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

75voto

John Topley Points 58789

Les Rails comportement par défaut, c'est que la colonne utilisée pour détenir la clé étrangère sur un modèle, c'est le nom de l'association avec le suffixe _id ajouté. L' :foreign_key option vous permet de définir le nom de la clé étrangère directement. Les associations entre vos Post et Comment des classes de modèle devrait ressembler à ceci:

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

—Notez que vous n'avez pas besoin d' :class_name => "Post" votre Comment modèle. Rails a déjà cette information. Vous ne devez spécifier :class_name et :foreign_key quand vous en avez besoin pour remplacer les Rails de conventions.

Vous avez raison que les Rails maintient les relations de clé étrangère pour vous. Vous pouvez les appliquer dans la couche de base de données si vous le souhaitez en ajoutant des contraintes de clés étrangères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X