2008-11-11 56 views
25

我有一個循環(用於@dataset中的項目),我希望在每次迭代中從另一個表中獲取不同的數據並進行一些將要打印的操作在視圖中。我無法從循環中使用的數據集中獲取這些數據。Rails:從循環的每次迭代中獲取數據表

我該如何根據MVC做到這一點?在視圖中,我可以將代碼放入循環中,但我認爲這太可怕了。

我必須使用助手來做到這一點,並從視圖中調用函數?

謝謝你在前進,

- ARemesal

回答

42

如果你有一個表,並且想要從另一個表中獲取數據,通常這是在has_many關係的情況下。例如,我們有@peoplePerson模式),和每個人has_many地址(Address模型)。在這種情況下做的最好的事情是這樣的

# Controller 
@people = Person.find(:all, :include => :addresses) 
... 

# View 
@people.each do |p| 
    p.addresses.each do |address| 
    ... 

如果你的數據不只是正常的數據庫表(也許你從Web服務或等得到它),然後一個很好的事情是建立所有提前在控制器中的數據,然後將其傳遞給視圖。事情是這樣的

# Controller 
@people = Person.find(:all) 
@people.each do |p| 
    # attach loaded data to the person object in controller 
    p.addresses = Address.load_from_somewhere_by_name(p.name) 
... 

這樣的視圖代碼保持清潔,這樣的:

# View 
@people.each do |p| 
    p.addresses.each do |address| 
    ... 
+0

對於我的紫袍,我認爲這是最好的解決方案。感謝Orion提供了一個提示,給了我很多新的想法:) – ARemesal 2008-11-13 09:39:11

1

這是很很難說你的問題,而你的模型(表)之間的數據和關係的細節有關最佳解決方案。接下來的共同點是:保持你的觀點愚蠢。獲取在控制器操作中渲染視圖所需的所有數據。在同一動作中進行所有更改和計算。然後在視圖中使用這些數據。

順便說一句,如果你在談論N + 1問題,那麼請閱讀更多關於'include'和'join'的ActiveRecord參數。

0
  • 把所有的邏輯上的@DataSet項目中的控制器動作
  • 利用你的模型與其他模型相互作用的方法中的對象,你需要
  • 你應該只剩@DataSet您的看法你可以在局部渲染。

您需要進一步解釋您的情況,以獲得更多的答案。你需要什麼類型的操作和其他模型進行交互?如果你發佈你的模型協會,我相信我們可以真正擺脫你。

祝你好運!

1

如果我是你,我會創建一個單獨的類來封裝數據集幷包含處理數據集條目時涉及的所有邏輯。這個類可以迭代(每個都可以響應)。然後我會將這個類的一個實例傳遞給視圖,並且只使用它的方法。

+0

我認爲這是一個很好而漂亮的解決方案,但這對我的需求來說太複雜了。我會爲未來添加註釋:) – ARemesal 2008-11-13 09:41:46

1
Person(id, name, other fields...) 
Event(id, title, ...) 
Date(id, date, time, event_id, ...) 
Disponibility(id, percent, date_id, person_id, ...) 

當然,所有的關係都是在模型中定義。

我有一個視圖,顯示一個事件的所有日期,這很容易。但是,我希望每個日期都能打印所有可用於該日期的人員的數據。在我看來,忘記了MVC設計模式,我喜歡這個代碼的東西:

<% for date in @Dates 
    available = Disponibility.find_by_date_id(date.id) 
    for item in available 
    guy = Person.find_by_id(item.person_id) 
%> 

渲染日期和可用的人......

我想避免這種情況的看法。我認爲Orion Edwards的答案是最接近我需要的,但是在那個例子中,地址是Person表的空字段?或者我怎樣才能將一個新的屬性添加到Person類?

雖然,我錯過了任何SQL技巧嗎?