2016-09-12 9 views
0

has_oneの関係で関連付けられた2つのモデルがあります。また、関連付けを初期化するコールバックもあります。クラスが見える(おおよそ)このように:Mongoidアソシエーションを遅延設定する方法

class User 
    has_one :relevance, class_name: 'User::Relevance', inverse_of: :user, dependent: :destroy 
    after_create :initialize_relevance 

    def initialize_relevance 
    self[:relevance] = User::Relevance.new 
    end 

    # other garbage that *should* be irrelevant 
end 

class User::Relevance 
    belongs_to :user, inverse_of: :relevance, index: true 

    # more other garbage that *should* be irrelevant 
end 

時々、関連性の関連付けは、それがnilであるwonked状態になります。これが起こると、関係が呼び出されたときにリレーションを再初期化し、リレーションの代わりにリターンを返す必要があります。これが動作しないとnilはまだ返される場合を除き

def relevance 
    self[:relevance] = User::Relevance.new if self[:relevance].nil? 

    self[:relevance] 
end 

:だからクラスUserに、我々はこれを持っているでしょう。私もupdate_attribute(User::Relevance.new)self.create_relevanceと同じように試しましたが、常にnilが返されるようです。ここからどこへ行くべきかわからず、アイデアが大好きです。また、役に立つと思われるコードや例を提供することもできます。

追加詳細

  • 私たちは、データベースのmongoidを使用しています。
  • relevanceに影響する他のコールバックはありません。代わりに、コールバックでの関連付けを設定するので、あなたはgetterメソッドでrelevanceを構築しようとするかもしれ

答えて

1

Mongoidは、自動ビルドワンをサポートしています1対1の関係。これは助けになります(フックやゲッターオーバーライドは必要ありません)。オプション名のヒントとして

has_one :relevance, 
     class_name: 'User::Relevance', 
     inverse_of: :user, 
     dependent: :destroy, 
     autobuild: true 

(それがアクセスする前にゼロだった場合)、relevanceは、アクセス時に生活に春ます。

また、このような関連性は維持されていないことにご注意ください。

after_create :initialize_relevance 

    def initialize_relevance 
    self[:relevance] = User::Relevance.new 
    end 

後でnilを返すのは不思議ではありません。

+0

これは完全に動作します、私は 'autobuild'パラメータを認識していませんでした。私たちは実際にはコールバックを少し違っていますが、あなたは完全に正しいです。私は物事を短縮するときに壊しました。本当に感謝しますが、ありがとう! –

0

class User 
    def relevance 
    self[:relevance] || User::Relevance.new 
    end 
end 

このパターンはうまくここに記述されている:http://blog.arkency.com/2016/07/always-present-association/

+0

実際にこれを試して、#に対して 'NoMethodError:未定義のメソッド' relevance 'を得ました。何らかの理由でスーパーコールが関連性協会に当たらないようです... –

+0

@RobertIngrum:このメソッドのスーパーはないので(モンゴイド付き) –

+0

私は 'self [:relevance]'に変更しました今すぐお試しください – mrzasa

関連する問題