从另一个模型的视图或控制器访问模型

时间:2011-10-29 10:40:09

标签: ruby-on-rails model-view-controller refactoring ruby-on-rails-3.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和用户模型对话?

欢迎思考,我真的希望看到任何样本应用程序也可以优雅地解决这类问题。

1 个答案:

答案 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对象。