В приложении, аналогичном StackOverflow, который я создаю, я пытаюсь решить, какие отношения должны иметь таблицы Questions
, Answers
и Comments
.
Я мог бы иметь Questions
и Answers
обе быть представлены одной таблицей Posts
.
Это позволит Comments
иметь один внешний ключ для Posts
.
Но если Questions
и Answers
являются отдельными таблицами, какие отношения должны Comments
иметь к каждому из них?
ОБНОВЛЕНИЕ. Хотя выбранный ответ рекомендует использовать метод наследования класса таблицы, и это похоже на лучший подход в терминах базы данных, этот параметр не поддерживается ORM Rails. Итак, в Rails моим моделям придется использовать Single Table Inheritance и, вероятно, будет выглядеть так:
class Post < ActiveRecord::Base
end
class Question < Post
has_many :answers, :foreign_key => :parent_id
has_many :comments, :foreign_key => :parent_id
end
class Answer < Post
belongs_to :question, :foreign_key => :parent_id
has_many :comments, :foreign_key => :parent_id
end
class Comment < Post
belongs_to :question, :foreign_key => :parent_id
belongs_to :answer, :foreign_key => :parent_id
end
class CreatePosts < ActiveRecord::Migration
def self.up
create_table :posts do |t|
t.string :type
t.string :author
t.text :content
t.integer :parent_id
t.timestamps
end
end
def self.down
drop_table :posts
end
end
CREATE TABLE "posts" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"type" varchar(255),
"author" varchar(255),
"content" text,
"parent_id" integer,
"created_at" datetime,
"updated_at" datetime
);