6

「トランザクション」があります (ActiveRecord::Base を拡張します)。「購入」または「寄付」という 2 種類のトランザクションがあります。2 つの別々のデータベース テーブルを作成する必要がないほど 2 つの間に十分な重複があるので、「item_type」列を持つトランザクション用のテーブルを 1 つだけ用意します。

ただし、購入と寄付には異なる方法と検証があるため、それらを 2 つの異なるコントローラーとモデルに分割することは理にかなっています。ActiveBase モデル (テーブルを除く) を作成する代わりに、これらのモデルごとにモジュールを使用しようとしています。

購入モジュールは次のようになります。

module Purchase
  def self.included(base)
    base.validates :amount, 
      :presence => true
  end

  def testing
    "testing"
  end
end

作成方法は次のとおりです (このコードは Purchases コントローラーの作成アクションにあります)。

@purchase = Transaction.new(params[:purchase]).extend(Purchase)

@purchase.testing を呼び出すことができ、「testing」が返されます。ただし、その検証は実行されていません。

「購入を含める」を使用して、トランザクションモデルに従来の方法でモジュールを含めると、それらは機能します。

このワークフローを実現する方法はありますか? 私はこれに少し従った:http://paulsturgess.co.uk/articles/84-how-to-include-class-and-validation-methods-using-a-module-in-ruby-on-rails

4

2 に答える 2

5

単一のテーブルと複数の列のみを操作したい場合は、単一のテーブルの継承が好ましいアプローチだと思います。単一テーブルの継承を検索すると、ここでそれについて読むことができます。ただし、モジュールを含める方法についての質問に関しては、モジュールをメタクラスに@purchase含めて、後続のすべてのトランザクションに含まれないようにする必要があると思います。このようなものです(間違いなく短縮できます):

@purchase = Transaction.new(params[:purchase])
class << @purchase
  include Purchase
end

次に、検証が機能するはずです。

于 2012-07-06T21:01:42.467 に答える
3

実行すると、フックは実行されませincluded.extend(Purchase)extendedそのためのフックが必要です。フック内extendedで、新しいオブジェクトの eigenclass で Rails 検証ヘルパーを呼び出すことができTransactionます (@Adam が示したものと同様)。

于 2012-07-06T21:41:30.687 に答える