Tengo una clase de comentario con una: foreign_key de post_id en la clase Post.Definición de relaciones de claves foráneas para los modelos de Rails
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 CreateComments no define una clave externa a 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
lugar post_id es una columna de enteros simples.
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 correspondiente modelo de publicación también declare su relación de clave externa recíproca con Comentarios usando 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
Comparto su sorpresa de que Rails no utiliza claves externas SQL. Hace que sea difícil usar herramientas sin rieles en los DB. – Greg
Rails sigue la convención de que "TODAS las lógicas comerciales deben definirse en la aplicación" ... por lo que utiliza DB solo como un almacenamiento "tonto". Sin claves externas, sin procedimientos almacenados, sin restricciones (soportado en postgres por ejemplo). EDITAR: Acabo de encontrar esta respuesta que dice lo mismo - http://stackoverflow.com/questions/8334602/need-to-create-a-foreign-key-when-creating-a-table-on-rails –
https://github.com/matthuhiggins/foreigner – wberry