0

私はレールにかなり慣れていませんが、最近、実際の動作とは逆に、 activerecords has_one関連付けを理解していることがわかりました。rubyonrailsガイドの例を参照して、 account_idを保持する必要があるのはサプライヤーであると想像しました。

理由がよくわからないか、オブジェクトが他のオブジェクトの外部キーを維持することに単に同意しないため、単純な問題に対する正しい Rails ソリューションが何であるかわかりませ。とドラフト。すべてのドキュメントには多くの下書きがあり、そのうちの 1 つが現在の下書きとしてマークされています。テーブルのレイアウトは次のようになると想像しました。

table document
    id
    current_draft_id
table draft
    id
    document_id
    text

ここで探しているのは、has_one関連付けのようなものですが、ドキュメントがcurrent_draft_idを保持および維持するように逆になっています。動作が異なるため、belongs_toの使用はオプションではありません。たとえば、document.current_draft = new_draftでforeign_keyを正しく更新したいと思います。

レールでこれにアプローチする方法は?

--更新 1

私の問題を明確にするために、現在のドラフトはcreated_atおよびupdated_atフィールドとは何の関係もないので、スコープは関係ないと仮定してください。

下書きテーブルに現在のフィールドを追加することは、テーブル設計の観点からは奇妙な動きです。公開されたドラフトに関する情報をドキュメントオブジェクトに追加することも計画していますが、そのような情報をドラフトテーブルで乗算することは奇妙な手順のようです。

私は Amesee のアイデアが気に入っていますが、現在の 列を下書きテーブルに追加するのと同様に、いくつかの抵抗があります。

4

2 に答える 2

1

私はそれを主張DraftするDocumentので、これらのクラスを単一のテーブル継承で管理する方が理にかなっているかもしれません。ドラフトが「現在のドラフト」であることは、その種類によってわかります。

class CreateDocuments < ActiveRecord::Migration
  def change
    create_table :documents do |t|
      t.string :type
      # ...

      t.timestamps
    end
  end
end

そしてモデル。

class Document < ActiveRecord::Base
  # ...
end

class Draft < Document
  # ...
end

class CurrentDraft < Draft
  # ...
end

後で下書きが「最新」でなくなったら、そのtype属性を「下書き」または「ドキュメント」に変更してタイプを更新します。これは、オブジェクトのブール値または日付属性を常にチェックし、アプリケーションのあらゆる場所でその状態について尋ねるよりも優れたソリューションだと思います。

于 2013-05-19T23:57:05.487 に答える
0

どのドラフトが「現在の」ドラフトであるかをどのように強制しますか? それは最近作成されたものでしょうか?最後に編集されたもの?現在のドラフトをドラフト テーブルの論理的に計算されたファセットにし、常にロジックに一致するとは限らない固定 ID を強制するのではなく、スコープで検索します。

class Document < ActiveRecord::Base
  has_many :drafts

  def current_draft
    self.drafts.ordered.first
  end
end

class Draft < ActiveRecord::Base
  belongs_to :document

  scope :all
  scope :ordered, order_by(:updated_at)
end

または、下書きテーブルにフィールドを追加し、:current, :boolean, :default => falsecurrent が true の子を 1 つだけにします。(このメソッドのロジックの適切な説明は、Rails 3 app model how ensure only one boolean field set to true at a time )にあります。

親に固定の子 ID が本当に必要な場合は、外部:belongs_toキーが定義されている必要があります。

ドキュメント テーブル:

id
current_draft_id

モデル:

class Document < ActiveRecord::Base
  has_many :drafts
  belongs_to :current_draft, :class_name => 'Draft', :foreign_key => 'current_draft_id'
end

コントローラーコードのどこかに:

@document.current_draft = @draft
于 2013-05-19T23:47:03.927 に答える