如何使用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 。
摘要
- 将
topic
SQL构建器提取到topic
下的eager
和recent
范围 - 将
comment_threads
SQL构建器解压缩到comment_thread
下的last_user_nickname
-
user_link
将UserDecorator
提取到UserDecorator
- 使用超薄! 🙂