4

フォームを使用して (ネストされた) レコードを追加/編集/削除する 1 つの方法は、対応するモデルで :accepts_nested_attributes_for: を使用することです。ただし、このネスティングが (データベースの正規化のため) 約 4 レベルに拡張され、Web サイトで編集するためにこれらすべてのレベルを表示したい場合、この方法はかなり面倒 (かつ醜い) と思われます。

必要なデータを 1 か所で編集できるゲッター メソッドとセッター メソッドを使用して「スーパー」モデルを定義する方法があるかどうか疑問に思っていました。簡単な例として、次のことを考慮してください。

class Person < ActiveRecord::Base
  attr_accessible :name, :age

  has_one :address
end

class Address < ActiveRecord::Base
  attr_accessible :street, :zip, :country

  belongs_to :person
end

名前、年齢、通り、郵便番号、国を 1 つの形式で表示/編集/更新/etc したいと考えています。accept_nested_attributes_for を使用してこれを行う方法は明らかです。しかし、Person から ID を渡すことによって、両方のクラスの名前、年齢、通り、郵便番号、国を組み合わせたクラス、たとえば、PersonalInformation が必要です。次に、このクラスを Web サイトのインターフェイスとして使用したいと思います。

4

3 に答える 3

1

ここで説明されているフォーム オブジェクトのようなもの:

http://robots.thoughtbot.com/activemodel-form-objects

私はさまざまな実装を試してきましたが、完璧な解決策は見つかりませんでしたが、それらは「多数のモデルをまとめる」ことを単純化します。codeclimate ブログでも触れています (項目 #3)。

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models

codeclimate の投稿では、ActiveModel モジュールを含める古い方法を使用しています (今すぐに必要でない限り、個別に含める必要はありません) が、概念は同じです。

于 2014-01-19T07:37:35.957 に答える
0

シンプルなフォルムの逸品をお勧めします。私は彼らのドキュメントから例を変更して、あなたが望むことを正確に実行するモデルを反映しました:

モデル:

class Person < ActiveRecord::Base
  attr_accessible :name, :age

  has_one :address
end

class Address < ActiveRecord::Base
  attr_accessible :street, :zip, :country

  belongs_to :person
end

意見:

<%= simple_form_for @person do |f| %>
  <%= f.input :name %>
  <%= f.input :age %>
  <%= f.association :street %>
  <%= f.association :zip %>
  <%= f.association :country %>
  <%= f.button :submit %>
<% end %>
于 2012-10-02T19:31:46.187 に答える
0

Person モデルで仮想属性を使用し、編集可能な各Address属性のゲッター/セッター内にカスタム割り当てロジックを配置できます。

class Person < ActiveRecord::Base
  attr_accessible :name, :age

  has_one :address

  def street=(new_street)
    # ...
  end
end

これは、長期的にはより複雑になる可能性があります。

于 2012-10-02T19:34:37.580 に答える