如何以最符合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 :(得分: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}" %>
如果您对此不满意,以下将是替代解决方案,