【问题标题】:Accessing a model from another model's view or controller从另一个模型的视图或控制器访问模型
【发布时间】: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


【解决方案1】:

正如 Rasmus 所说,如果我们利用联想,它是一个简单的想法, 用户模型:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2021-09-24
    相关资源
    最近更新 更多