Определение отношений внешнего ключа для моделей Rails - PullRequest
53 голосов
/ 24 мая 2009

У меня есть класс 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

1 Ответ

75 голосов
/ 24 мая 2009

По умолчанию в 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 поддерживает отношения с внешним ключом для вас. Вы можете применить их на уровне базы данных, если хотите, добавив ограничения внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...