2011-01-11 21 views
1

私は、結合テーブル内の同じオブジェクトの数量を格納するフィールドを処理する最善の方法を見つけようとしています。has_many throughと追加データ:count

Schema

class Element < ActiveRecord::Base 
    has_many :connections 
    has_many :connector_types, :through => :connections 
end 

class ConnectorType < ActiveRecord::Base 
    has_many :connections 
    has_many :elements, :through => :connections 
end 

class Connection < ActiveRecord::Base 
    belongs_to :element 
    belongs_to :connector_type 
end 

私はElementConnectorTypeを追加します。

  • このConnectorTypeためConnectionが存在する場合は、このConnectorType
  • のために存在しない場合Connectionを作成する必要があります、Connection#numberは増分する必要があります

私はElementからConnectorTypeを削除:

  • Connection#numberがデクリメントされなければなりません。
  • Connection#number == 0は私がこれを行うにはRailsの方法を知っていないレールに新しいですConnection

削除した場合:

  • コールバック
  • が重複行として数フィールドとストアをダンプ結合モデルでは
  • ...
+0

コールバックには何をしますか? http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.htmlにはたくさんのオプションがあります。あなたはjoin associationのためにhas_and_belongs_to_manyを調べましたか? –

答えて

2

私はよく理解していれば、あなたは、与えられた要素と与えられたconnector_type間の接続の数を監視したい、しかし、あなたは、データベース内の重複Connectionオブジェクトを持ってしたくないですか?

あなたはしかし、私はこのようにhas_manyの関係を経由して要素にconnector_typeを追加することはよく分からない(コードがテストされていません)このため

# connection.rb 
before_create :bc_callback 
before_destroy :bd_callback 


private 
def before_create 
    if (existing_connection = self.find_by_element_id_and_connector_type_id(element_id, connector_type_id)) 
    existing_connection.number++ 
    existing_connection.save 
    return false # Do not create a new connection object 
    end 
end 

def before_destroy 
    number-- 
    # If you still have 1 connection or more, the object won't be destroyed 
    if (number > 0) 
    save 
    return false 
    end 
end 

をコールバックを使用することができます。

@element.connector_types << @connector_type 

この要素とこのコネクタの種類を既にリンクしている場合は、新しい接続の作成をトリガーします。

+0

これは私が欲しいものですが、オブジェクト作成を避けるためにbefore_createコールバックでfalseを返すと、ActiveRecord :: RecordNotSavedが返されます –

+0

作成を呼び出すのでこれはありません!作成または保存する代わりに!保存する代わりに? – MrRuru

関連する問題