如何使用Model和controler not view来获取如下所示的记录?

如何使用Model和controler not view来获取如下所示的记录?

样式1。 有了帮手

application_helper

def user_link(username) link_to User.find_by_username(username).user_profile.nickname, show_user_path(username) end 

视图

    

模式2。 没有帮手。 只是查看

    

UPDATE

     

SQL代码或SQL构建器永远不应该到达视图层。 这应该在你的模型中。 我甚至不会在控制器中放置这样的查询。

我将topic SQL构建器解压缩到命名范围。 最重要的是,为了避免n + 1个查询,我创建了另一个命名范围eager

 # topic.rb scope :eager, includes(comment_threads: :user) scope :recent, lambda { |n = 100| order("updated_at DESC").limit(n) } 

然后我将comment_threads SQL构建器移动到comment_threads模型中:

 # comment_thread.rb def self.last_user_nickname order("id").last.user.nickname end 

我们现在可以整理你的意见:

 <% @topics.eager.recent.each do |topic| %> <%= user_link(topic.comment_threads.last_user_nickname) if topic.comment_threads.present? %> <% end %> 

请允许我向你推销Slim (另类):

 - @topics.eager.recent.each do |topic| = user_link(topic.comment_threads.last_user_nickname) if topic.comment_threads.present? 

我甚至可能更进一步,将user_link提取到UserDecorator 。 有关详细信息,请参阅https://github.com/drapergem/draper 。

摘要

  1. topic SQL构建器提取到topic下的eagerrecent范围
  2. comment_threads SQL构建器解压缩到comment_thread下的last_user_nickname
  3. user_linkUserDecorator提取到UserDecorator
  4. 使用超薄! 🙂