0

ビューではなくモデルとコントローラーを使用して、以下のようにレコードを取得するにはどうすればよいですか?

パターン1. ヘルパー付き

application_helper

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

見る

<% @topics.order("updated_at DESC").limit(100).each do |topic| %>
    <%= user_link(topic.comment_threads.order("id").last.user.username) if topic.comment_threads.present? %>
<% end %>

パターン2.ヘルパーなし。見るだけ

<% @topics.order("updated_at DESC").limit(100).each do |topic| %>
    <%= link_to(topic.comment_threads.order("id").last.user.nickname, show_user_path(topic.comment_threads.order("id").last.user.username) ) if topic.comment_threads.present? %>
<% end %>

アップデート

  <%  @community.topics.eager.recent.each do |topic| %>
    <%= user_link(topic.comment_threads.order("id").last.user.username) if topic.comment_threads.present? %>
  <% end %>
4

1 に答える 1

1

SQL コードまたは SQL ビルダーがビュー レイヤーに到達することは決してありません。これはあなたのモデルにあるはずです。このようなクエリをコントローラーに配置することさえしません。

topicSQL ビルダーを名前付きスコープに抽出します。その上、n+1 クエリを避けるために、別の名前付き scope を作成しますeager

# topic.rb

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

次に、comment_threadsSQL ビルダーを 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をあなたに販売させてください (erb 代替):

- @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. topicintoeagerおよびrecentscopes のSQL ビルダーを抽出します。topic
  2. 下にSQL ビルダーを抽出comment_threadsします。last_user_nicknamecomment_thread
  3. に抽出することuser_linkを検討してくださいUserDecorator
  4. スリムを使おう!:)
于 2013-01-20T21:59:34.927 に答える