2013-07-15 82 views
0

我是新手創建我的第一個應用程序,一些紅寶石愛好者告訴我,我的方法編碼哪裏效率不高。因爲進入一個乾淨的狀態需要很多工作,所以我想確保爲我做的更好。Rails最佳實踐 - 我可以使用很多「有很多」嗎?

在下面的代碼中,您是否認爲我在過度使用has_many方法,如果是,應該如何替換它?

class Product < ActiveRecord::Base 

    # Offerers 
    has_many :ownerships, dependent: :destroy 
    has_many :owners, through: :ownerships, 
         source: :offerer 

    # Seekers 
    has_many :loans, dependent: :destroy 
    has_many :borrowers, through: :loans, 
        source: :seeker 



    # Owners 
    has_many :previous_ownerships, -> { where 'owning_date IS NOT NULL AND giving_date IS NOT NULL', agreed: true }, 
           class_name: 'Ownership' 
    has_one :current_ownership, -> { where current: true, agreed: true }, 
          class_name: 'Ownership' 
    has_many :next_ownerships, -> { where owning_date: nil, giving_date: nil }, 
          class_name: 'Ownership' 

    has_many :previous_owners, through: :previous_ownerships, 
          source: :offerer 
    has_one :owner, through: :current_ownership, 
        source: :offerer 
    has_many :next_owners, through: :next_ownerships, 
         source: :offerer 


    # Borrowers 
    has_many :previous_loans, -> { where 'return_date IS NOT NULL AND borrowing_date IS NOT NULL', agreed: true }, 
          class_name: 'Loan' 
    has_one :current_loan, -> { where current: true, agreed: true }, 
           class_name: 'Loan' 
    has_many :next_loans, -> { where borrowing_date: nil, return_date: nil }, 
            class_name: 'Loan' 

    has_many :previous_borrowers, through: :previous_loans, 
           source: :seeker 
    has_many :next_borrowers, through: :next_loans, 
          source: :seeker 
    has_one :borrower, through: :current_loan, 
           source: :seeker 

# Agreed or refused owners 
    has_many :agreed_ownerships, -> { where agreed: true, owning_date: nil, giving_date: nil }, 
           class_name: 'Ownership' 
    has_many :possible_ownerships, -> { where agreed: nil, owning_date: nil, giving_date: nil }, 
           class_name: 'Ownership' 
    has_many :refused_ownerships, -> { where agreed: false, owning_date: nil, giving_date: nil }, 
           class_name: 'Ownership' 
    has_many :agreed_owners, through: :agreed_ownerships, 
          source: :offerer 
    has_many :possible_owners, through: :possible_ownerships, 
          source: :offerer 
    has_many :refused_owners, through: :refused_ownerships, 
          source: :offerer 

    # Agreed or refused borrowers 
    has_many :agreed_loans, -> { where agreed: true, borrowing_date: nil, return_date: nil }, 
           class_name: 'Loan' 
    has_many :possible_loans, -> { where agreed: nil, borrowing_date: nil, return_date: nil }, 
           class_name: 'Loan' 
    has_many :refused_loans, -> { where agreed: false, borrowing_date: nil, return_date: nil }, 
           class_name: 'Loan' 
    has_many :agreed_borrowers, through: :agreed_loans, 
          source: :seeker 
    has_many :possible_borrowers, through: :possible_loans, 
          source: :seeker 
    has_many :refused_borrowers, through: :refused_loans, 
          source: :seeker 

回答

1

在許多地方,您使用has_many就好像它是一個範圍。

閱讀範圍here

作用域允許您定義可以像方法一樣訪問的查詢。例如:

class Loan < ActiveRecord::Base 
    scope :current, where(current: true, agreed: true) 
end 

可稱爲像這樣:Product.first.loans.current

確保你把這些範圍在合適的型號太多,你不希望在例如產品型號來篩選貸款。

+0

謝謝!如果我想獲得我的產品的關聯用戶,我該怎麼辦? Product.first.loans.current.borrowers是否可以工作? –

+0

只要您的所有關係和範圍都以良好的導軌方式定義,就應該這樣做。搏一搏! – Matt

+0

不,它不起作用...'Product.first.loans.current'發送一個'loan'數組,因此我不能使用僅適用於一個對象的鏈式方法... –