Доступ к модели из вида другой модели или контроллера - PullRequest
1 голос
/ 29 октября 2011

Как я могу найти кросс-модель таким способом, который наиболее соответствует шаблону MVC?

У меня есть модель, Istc.rb. В индексном представлении, соответствующем этой модели, я хочу сделать это:

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

Ясно, что вы не можете иметь модель.find в представлении - и это не только модель.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 Ответ

3 голосов
/ 29 октября 2011

Как сказал Расмус, если мы используем ассоциацию, то это простое мышление, модель пользователя:

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 непосредственно из представления.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...