2009-09-02 8 views
0

私のコードにいくつかの問題があります。これはおそらく設計上の問題が原因です。私はいくつかのことを試しました。ここに2つあります。ActiveRecordの関連付けを持つ多くの人から最新の単一項目を取得するにはどうすればよいですか?

問題:私は1 (lending) - N (contracts)の関係を持っています。最後に関連する契約を返すlending.current_contractに電話したいと思います。 最適化も問題です。私は:lending, :include => :contractsに電話して、すべての契約を含む契約配列に既に入っている契約のために別々のクエリを使用する必要はありません。

悪い解決策1:

has_one :current_contract, :class_name => "Contract" 

これは、同様に親融資を更新する必要があり、私が作成するたびので、仕事更新したり破壊されることはありません。これを行うと、私はコールバック混乱を取得します。たとえば、貸出を作成するときには、最初の契約も作成されます。何らかの理由で、両方の融資契約のコールバックを使用して前後しているため、契約が機能しません。

悪い解決策2:

def current_contract 
    return if contracts.relevant.empty? 
    @current_contract = contracts.relevant.last 
end 

が参照コピーを送信していません。したがってlending.current_contract.status = valueは機能しません。

見るべきデザインパターンはありますか?いくつかの例がありますか?私はgithubプロジェクトをいくつか見てきましたが、どれも同じような問題が解決されていないので、設計上の問題だと思います。

答えて

3

アソシエーションには一般的に:conditionsハッシュが使用できますが、これは便利です。 (そして私は30分ほど前にそれが必要になるまでこれを忘れてしまった)。

それは役に立ちますか? the bookを見ると

has_one :current_contract, :class_name => "Contract", :conditions => ... 

もう少し(ページ364は、正確には):何かのように、最も最近作成した契約書を参照します

has_one :current_contract, :class_name => "Contract", :order => 'created_at DESC' 

...。もちろん、もっと適切な列を持っているかもしれません。

私は、以前のことがわかるのだたい - 私はあなたが最新の意味だ、「関連する」とは...今

0

をいくつかのコードを移動して、変更する必要がありますか?

class Lending < ActiveRecord::Base 
    has_many :contract 
    attr_reader :current_contract 

    def initialize 
    @current_contract = Contract.New 
    end 
    ... 
end 

class Contract < ActiveRecord::Base 
    has_one :lending 
    ... 

    def before_delete 
    # update lending to the most relevant contract 
    # if this is the current_contract for parent lending 
    end 
end 
関連する問題