relaciones rails modelos migraciones migracion llaves hacer foreign foraneas eliminar columna belong association ruby-on-rails foreign-keys

ruby on rails - migraciones - Definición de relaciones de claves foráneas para los modelos de Rails



migracion en rails (1)

El comportamiento predeterminado de Rails es que la columna utilizada para mantener la clave externa en un modelo es el nombre de la asociación con el sufijo _id agregado. La opción :foreign_key permite configurar el nombre de la clave externa directamente. Las asociaciones entre tus clases de modelo de Post y Comment deberían verse así:

class Post < ActiveRecord::Base has_many :comments end class Comment < ActiveRecord::Base belongs_to :post end

-Note que no necesitas :class_name => "Post" en tu modelo de Comment . Rails ya tiene esa información. Solo debe especificar :class_name y :foreign_key cuando necesite anular las convenciones de Rails.

Tiene razón en que Rails mantiene las relaciones de claves foráneas para usted. Puede aplicarlos en la capa de la base de datos si lo desea agregando restricciones de clave externa.

Tengo una clase de Comentario con una: foreign_key de post_id en la clase Post.

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

Pero mi migración de CreateComments no define una clave foránea de nivel de base de datos:

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

En cambio, post_id es una columna Entero simple.

Entonces, parece que esta relación de clave externa existe solo en la mente de Rails, no en el nivel de la base de datos.

¿Es esto correcto?

Además, ¿es necesario que el modelo de publicación correspondiente también declare su relación de clave externa recíproca con Comentarios utilizando el atributo: foreign_key o podría omitirse?

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