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.
- Creo que se beneficiaría al leer una guía de asociaciones de ActiveRecord .
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