1

如何以最符合MVC模式的方式進行交叉模型查找?從另一個模型的視圖或控制器訪問模型

我有一個模型,Istc.rb.在對應於這種模式索引視圖,我想這樣做:

= "Last edited by #{User.find_by_id(istc.user_id).first_name}"  

顯然,你不能有一個model.find的觀點 - 這不僅是一個model.find,這是一個發現在不同的模型上。但是,你會如何重構這個?

我擔心有這樣的,因爲它仍然是相當接近View層幫手:

module UsernameHelper 
    def user_name(model) 
    User.find_by_id(model.user_id) unless User.find_by_id(model.user_id).nil? 
    end 
end 

是這樣做會對用戶範圍的方式嗎?

# User.rb 
scope :lookup, lambda {|model| where("id = ?", model.user_id)} 

# username_helper.rb 
module UsernameHelper 
    def user_name(model) 
    User.lookup(model).first unless User.lookup(model).first.nil? 
    end 
end 

還是應該istcs_controller處理它?還是應該有一個單獨的控制器,與Istc和用戶模型進行對話?

想法很受歡迎,我真的很希望看到任何可以優雅地解決這類問題的示例應用程序。

+0

在模型和控制器或視圖之間沒有強制1對1的關係。所以不要太擔心這個部分。使用您需要的模型來構建視圖。您的模型之間是否建立了關聯? http://guides.rubyonrails.org/association_basics.html 然後你可以用它通過Istc模型找到用戶。 – Rasmus

+0

對我來說範圍是最好的解決方案 –

回答

3

正如拉斯穆斯說,如果我們利用關聯的一個簡單的思考, 用戶模型:

class User < ActiveRecord::Base 
    has_many :istcs, :class_name => "Istc" 
end 

ISTC型號:

class IStc < ActiveRecord::Base 
    belongs_to :user 
end 

觀點:

<%= "Last edited by #{istc.user.first_name}" %> 

如果你對此不滿意以下將是替代解決方案,

  1. 在application_herlper.rb中編寫一個輔助方法(因爲您在不同的控制器視圖中使用。
  2. 在Istc.rb模型中編寫實例方法,您可以直接從視圖調用istc對象。
相關問題