0

Rails アプリにモデルAddressとモデルがあります。Order注文には、請求先住所と配送先住所があります。私はこれをポリモーフィックな関連付けで実装する最も効率的な方法を見つけようとしています (他のモデルにも将来アドレスがあります)。これが私が思いついたコードです:

アドレス.rb:

class Address < ActiveRecord::Base
  attr_accessible :line_1, :line_2, :city, :county, :postcode
  # Also has an 'address_type' attribute

  belongs_to :addressable, polymorphic: true
end

order.rb:

class Order < ActiveRecord::Base
  has_many :addresses, as: :addressable

  def delivery_address
    addresses.where(address_type: 'delivery').first
  end

  def delivery_address=(address)
    address.address_type = 'delivery'
    addresses << address
  end

  def billing_address
    addresses.where(address_type: 'billing').first
  end

  def billing_address=(address)
    address.address_type = 'billing'
    addresses << address
  end
end

アドレスの追加:

Order.first.address = Address.new(line_1: 'My House', city: 'Cityville, county: 'Hazzard')

これは、もう一度呼び出してアドレスを変更しようとするとorder.delivery_address=、タイプ「配信」の別のアドレスが追加されることを除いて、ほとんど機能します。また、もっとエレガントな方法が必要だと確信しており、アドバイスをいただければ幸いです。

4

2 に答える 2

1
has_one :delivery_address, as: :addressable,
         conditions: "addresses.address_type = 'delivery'", class_name: "Address"
has_one :billing_address,  as: :addressable,
         conditions: "addresses.address_type = 'billing'", class_name: "Address"
于 2012-11-21T18:59:57.803 に答える
-1

コードは見栄えがします。アドレスの追加と変更の違いは、モデルではなくコントローラーで処理する必要があると思います。たとえば、RESTful の場合、 と のメソッドがcreateありupdate、その場合、値を置き換えるか追加するかを知ることができます。

Rails の Dirty attributes のサポートも参照してください。これにより、何かが変更されたかどうかがわかります。

于 2012-11-21T18:54:43.947 に答える