MySQL和Rails中的外键建议

Dam*_*tal 2 ruby mysql ruby-on-rails foreign-keys

我正在开发我的第一个真正的rails项目,我正在寻找一些专业建议.

我期待在MySQL数据库中有四个表(用户,书籍,评论,标签),并适用以下业务规则.

用户可以为一本书制作一个或多个评论,但评论只能属于一本书.用户可以针对书籍放置一个或多个标签,但标签只能属于一本书.

从图形上看,我提到了以下内容:( ascii art永远不会死)

+---------+             +---------+  
|         |             |         |
|         |             |         |
|  User   |1           1|  Book   |
|         |-----   -----|         |
+---------+     |  |    +---------+
     | 1        |  |          | 1
     |          |  |          |
     |          |  |          |              
     | 1,*      |  |          | 1,*
+---------+     |  | 1,*+---------+  
|         |     ---+----|         |
|         |1,*     |    |         |
| Comment |---------    |   Tag   |
|         |             |         |
+---------+             +---------+
Run Code Online (Sandbox Code Playgroud)

我正在寻找有关如何在Rails中配置我的模型的任何建议.目前我正在设置:

class Users
  has_many :tags
  has_many :comments
  has_many :tagsBooks, :through=>tags, :class_name => "tags_books"
  has_many :commentsBooks, :through=>comments, :class_name => "comments_books"
end

class Books
  has_many :tags
  has_many :comments
  has_many :tagsUsers, :through=>tags, :class_name => "tags_users"
  has_many :commentsUsers, :through=>comments, :class_name => "comments_users"
end

class Tags
  belongs_top :users
  belongs_to :books
end

class Comments
  belongs_top :users
  belongs_to :books
end
Run Code Online (Sandbox Code Playgroud)

我相信这将有助于在标签和评论表中强制执行外键字段(User_id和Books_id) - 这最终是我需要做的.我希望这将允许我将标签和评论关联到用户和书籍,即books.tags或users.tags.

它是否正确?

只要在db和rails中强制执行外键,我很乐意彻底改变设计.

干杯,

达摩

Sye*_*lam 6

这不会强制执行db中的外键,它们只是整数列.他们只协助模型层.t.references也没有帮助.要强制使用外键,您需要手动创建它们.我通常在迁移方法(updown)中做这样的事情:

execute <<-SQL
  ALTER TABLE <table_name>
    ADD CONSTRAINT fk_name
    FOREIGN KEY (column_name)
    REFERENCES table_name(id)
SQL
Run Code Online (Sandbox Code Playgroud)

这将在db上创建和强制执行外键.