0

我正在构建一个具有跨页和页面的页面布局应用程序。每个跨页包含两页(左页和右页)。

数据库如下所示:

create_table :spreads do |t|
  ...
  t.references :left_page
  t.references :right_page
  ...
end

create_table :pages do |t|
  # No foreign keys
end

从语义上讲,两个页面属于一个跨页,因此按如下方式设置模型是有意义的:

class Spread < ActiveRecord::Base
  has_one :left_page, :class_name => 'Page'
  has_one :right_page, :class_name => 'Page'
end

class Page < ActiveRecord::Base
  belongs_to :spread
end

但是,由于外键存在于 spreads 表中,Rails 似乎要求相反:

class Spread < ActiveRecord::Base
  belongs_to :left_page, :class_name => 'Page'
  belongs_to :right_page, :class_name => 'Page'
end

class Page < ActiveRecord::Base
  has_one :spread
end

每当我在 Rails 中遇到这样的事情时,我都会认为我以错误的方式处理问题。是这种情况还是我只是生活在阅读不太清楚的代码中?

4

1 回答 1

2

简短的回答:

这取决于您的业务规则。

更长的答案:

这是一个架构设计问题,而不是真正的 Rails 问题......

由于您已经决定外键必须在spreads表中,这意味着您有充分的理由这样做(对吗?)。belongs_to只反映了这种结构。

当然,您可以将这些 FKS 放在pages桌子上。功能上,它(或多或少)没有改变......现在。但是当你实现回调时它会如何工作呢?操作您的对象有多容易?

这是一个架构决定,只有您可以决定。

Now, IMHO, it seems that your design is right. This structure holds more information in itself that would the other solution : your spread object will always have 0-1 left page and 0-1 right page; not only the fact that a spread has at most 2 pages is reflected in this structure, but each FK also reflects a quality of the association (left or right page). So i would stick with this solution, even if it "reads weird".

于 2013-02-01T20:43:24.180 回答