【发布时间】:2011-10-29 10:40:08
【问题描述】:
如何以最符合 MVC 模式的方式进行跨模型查找?
我有一个模型,Istc.rb。在这个模型对应的索引视图中,我想这样做:
= "Last edited by #{User.find_by_id(istc.user_id).first_name}"
显然,您不能在视图中拥有 model.find - 这不仅是 model.find,而且是在不同模型上的发现。但是你会如何重构它呢?
我对有这样的助手感到紧张,因为它仍然非常靠近视图层:
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 和 User 模型对话?
欢迎提出想法,我也非常希望看到任何能够优雅地解决此类问题的示例应用程序。
【问题讨论】:
-
模型和控制器或视图之间没有强制的一对一。所以不要太担心那部分。使用构建视图所需的模型。您的模型之间是否建立了关联? guides.rubyonrails.org/association_basics.html 然后就可以通过 Istc 模型找到用户了。
-
对我来说范围是最好的解决方案
标签: ruby-on-rails model-view-controller refactoring ruby-on-rails-3.1