Подтвердить что ты не робот

Определение отношений внешнего ключа для моделей Rails

У меня есть класс Comment с: foreign_key из post_id в классе 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

Но мой перенос CreateComments не определяет внешний ключ на уровне базы данных:

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

Вместо post_id - простой столбец Integer.

Итак, похоже, что это отношение внешних ключей существует только в разуме Rails, а не на уровне базы данных.

Правильно ли это?

Кроме того, необходимо, чтобы соответствующая модель Post также объявляла свою взаимную связь внешнего ключа с комментариями с использованием атрибута: foreign_key или может быть опущена?

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
4b9b3361

Ответ 1

Поведение по умолчанию Rails - это то, что столбец, используемый для хранения внешнего ключа в модели, - это имя ассоциации с добавленным суффиксом _id. Параметр :foreign_key позволяет напрямую указать имя внешнего ключа. Ассоциации между вашими классами Post и Comment должны выглядеть так:

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

— Обратите внимание, что вам не нужно :class_name => "Post" в вашей модели Comment. У Rails уже есть эта информация. Вы должны указывать только :class_name и :foreign_key, когда вам нужно переопределить соглашения Rails.

Вы правы, что Rails поддерживает отношения с внешним ключом для вас. Вы можете принудительно применять их на уровне базы данных, если хотите, добавив ограничения внешнего ключа.