私はCharacter
クラスとクラスを持っています。 1つの文字が別の「兄弟」で、私はcharacter_id
(編集中の「主」の文字)でSiblingshipインスタンスを保存することを示すために代わりにリレーションクラスでafter_addメソッドを定義するにはどうすればよいですか?
とsibling_id
(文字が主要キャラクターの兄弟としてマークされています) 。
逆ID付きのインスタンスを自動的に作成する機能を追加したいとします(したがって、アリスをボブの兄弟としてマークした場合、ボブはアリスの兄弟としてマークします)。私は、文字クラスのロジックを置く場合
これは簡単after_add
次のようになります。
class Character < ActiveRecord::Base
has_many :siblingships
has_many :siblings, through: :siblingships, after_add: :reciprocate
def reciprocate(sibling)
...
end
end
しかし、これはこのような〜100の異なる関係を持つ大規模プロジェクトがある(ダース異なる「コンテンツ」のクラスを結びます、文字だけでなく)、after_add
(そしてしばしば逆のafter_remove
)をCharacterモデルに格納することは非常に扱いにくいものになります。
私はその関連を保持するクラスではなく、その関連に「このタイプの関連付けが作成されたときに何をするのか」のロジックを保存したいと思います。以下のような
何か:
class Character < ActiveRecord::Base
has_many :siblingships
has_many :siblings, through: :siblingships, after_add: Siblingship.reciprocate
end
はこれを行うには良い方法はありますか?私はまた、[(、0を指定した1を予想)引数の間違った番号を]のみがエラーん
has_many :siblings, through: :siblingships, after_add: Siblingship.new.reciprocate
でもないように、インスタンスメソッドとしてreciprocate
を指定しようとした方法で、それはまた間違って感じてきましたインスタンスメソッドに到達するためにここで兄弟姉妹をインスタンス化すること。
Characterクラスをきれいに保ち、好ましくはそのリレーションのクラス内の各リレーションについて論理を保持しながら、この問題を解決する方法については、非常に感謝します。
私はあなたが何をしようとしているかは完全にはわかりませんが、after_addにはシンボルまたはlamba/procを渡す必要があることに注意してください。あなたの 'Siblingship.reciprocate'は、モデルクラスが定義された時に評価されます_ –
私は、POROクラスを作成して全体を管理し、相互関係を作成することが推奨されます。なぜなら、これは「兄弟姉妹」や「兄弟」の関心事ではなく、これらの関係の創造を監督する「兄弟姉妹」のようなものによって管理されるべきであるからです。 – engineersmnky
@engineersmnky保存コールバックをトリガーするのではなく、モデル(文字)の更新を含むサービスのようなものがありますか?理想的には、各関係のマネージャーを作成しない方がよいでしょう。そこには〜100人がいるからです。 – drusepth