0

スプレッドとページを持つページ レイアウト アプリケーションを構築しています。各見開きには 2 ページ (左ページと右ページ) が含まれます。

データベースは次のようになります。

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

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

意味的には、2 つのページが見開きに属しているため、次のようにモデルを設定するのが理にかなっています。

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

しかし、外部キーはスプレッド テーブルに存在するため、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

簡潔な答え:

ビジネスルールによって異なります。

より長い答え:

これはスキーマ設計の問題であり、実際にはレールの問題ではありません...

spreads外部キーがテーブルにある必要があるとすでに決めているので、そうする正当な理由があったことを意味します (そうですか?)。belongs_toこの構造のみを反映しています。

pages確かに、それらの FKS をテーブルに置くこともできました。機能的には、(多かれ少なかれ)何も変わりません...今のところ。しかし、コールバックを実装するとどうなるでしょうか? オブジェクトを操作するのはどれくらい簡単ですか?

これはアーキテクチャ上の決定であり、決定できるのはあなただけです。

さて、私見ですが、あなたのデザインは正しいようです。この構造は、他のソリューションよりも多くの情報を保持します。spreadオブジェクトには、常に0-1 の左ページと 0-1 の右ページがあります。見開きが最大2 ページであるという事実がこの構造に反映されているだけでなく、各 FK も関連付けの(ページまたはページ) を反映しています。したがって、「奇妙に見える」場合でも、このソリューションに固執します。

于 2013-02-01T20:43:24.180 に答える