2014-01-15 48 views
1

是否存在特定的一種或多種模式,我可以通過研究來解決這種情況。導軌訪問相關型號屬性的最佳實踐

我正試圖用最好的方式來訪問相關模型的屬性,有時遠程相關的模型。

一個簡單的例子:

class Customer 
has_many :sites 
end 

class Site 
# Customer is not required 
belongs_to :customer 
has_many :slips 
end 

class Slip 
belongs_to :site 
end 

我有一個顯示有關特定單信息的報告。 在該報告中,我想引用客戶的全名,它是來自Customer中複雜方法的幾個字段的串聯。

現在,我認爲這是最好不要做slip.site.customer.full_name:

1)的關聯是模型之間太緊,好像我需要知道太多關於擴展關係和使我的代碼變得脆弱。 2)我不得不做一個零測試,如果沒有客戶的網站。 3)2,我在哪裏進行測試,當然最好在Site中有一個像customer_full_name這樣的方法,但是如果它只用於Slip和Customer,那麼混淆網站似乎是錯誤的。

在這個例子中,我只有一個擴展關係,但是如果我有屬於網站的門票,並且我需要相同的信息。

接縫最好創建一個單獨的幫助器接受參數以生成所需輸出的類?

回答

0

您是否嘗試過使用Rails的代表方法? http://apidock.com/rails/Module/delegate

在這種情況下...

# slip.rb 
# ... 

has_one :customer, through: :site 
delegate :full_name, to: :customer, prefix: :customer, allow_nil: true 

# ... 

要從滑獲得相關客戶的名字,使用@slip.customer_first_name如果沒有客戶存在,這將返回nil

+0

不,事實上我甚至沒有完全意識到它,我已經看到它在一些地方使用,但從來沒有理解它的功能。 – user564372