Ruby on Rails v3.2.2 を使用していますが、mixin モジュールでアクティブ レコード アソシエーションを宣言するのが有効な方法であるかどうかを知りたいです。なんで?
もっと:
- このアプローチの長所と短所は何ですか?
- 何か気をつけることはありますか?
- それを作るための処方箋はありますか?
注: アクティブ レコード アソシエーションに関連するステートメントは複数のモデルで同じであるため、コードを DRY (Don't Repeat Yourself) したいと考えています。
Ruby on Rails v3.2.2 を使用していますが、mixin モジュールでアクティブ レコード アソシエーションを宣言するのが有効な方法であるかどうかを知りたいです。なんで?
もっと:
注: アクティブ レコード アソシエーションに関連するステートメントは複数のモデルで同じであるため、コードを DRY (Don't Repeat Yourself) したいと考えています。
あなたはそれを行うことができますが、ブロックでそれを行うことに注意する必要がありますincluded do...end.
私の意見では、DRY ではなく、動作をカプセル化するためだけであっても、モデルのコードを独立したモジュールに分離することは非常に価値があります。
さあ、やってみよう!ご質問について:
1 について: 最大の利点は、重複したコードのないクリーンなコード ベースを使用できることです。私が考えることができる最大の欠点は、あなたのコードを見ている人にはすぐにはわからないかもしれないということです.
included3 に関して:コールバックで、または新しいActiveSupport::Concern拡張機能を使用して関連付けを定義する必要があります。
例:
# using the standard include callback
module LocationAwareness
def self.included(base)
base.has_one :location
end
end
また
# using ActiveSupport::Concern
module LocationAwareness
extend ActiveSupport::Concern
included do
base.has_one :location
end
end
次に、次のようにモデルで使用できます。
class Person < ActiveRecord::Base
include LocationAwareness
end
class Gig < ActiveRecord::Base
include LocationAwareness
end
#...
もちろん、このアプローチは、「単なる」関連付けよりも多くの行動を共有している場合、さらに理にかなっています...