3

と呼ばれるアクションがupdate_mobileあり、その中でRABLJSONリクエストで使用する大量のインスタンス変数を準備しています。リクエストにparams[:last_updated]パラメータが含まれている場合、それ以降に更新されたモデルのみを取得することがわかります。これは「FatModels、SkinnyControllers」の方法に従わないようです。このメソッドをリファクタリングするにはどうすればよいですか?

  def update_mobile
    @last_updated = params[:last_updated]
    if @last_updated.nil?
      @buddies = @user.friends
      @courses = @user.courses
      @friendly_schools = @user.friendly_schools
      @documents = @user.all_notes
      @instructors = @user.current_instructors
      @friendships = @user.friendships
      @questions = @user.current_questions
      @answers = @user.current_answers
      @comments = @user.current_comments
    else
      @buddies = @user.friends.select{ |user| user.updated_at > @last_updated }
      @courses = @user.courses.select{ |course| course.updated_at > @last_updated }
      @friendly_schools = @user.friendly_schools.select{ |school| school.updated_at > @last_updated }
      @documents = @user.all_notes.select{ |note| note.updated_at > @last_updated }
      @instructors = @user.current_instructors.select{ |instructor| instructor.updated_at > @last_updated }
      @friendships = @user.friendships.select{ |friendship| friendship.updated_at > @last_updated }
      @questions = @user.current_questions.select{ |question| question.updated_at > @last_updated }
      @answers = @user.current_answers.select{ |answer| answer.updated_at > @last_updated }
      @comments = @user.current_comments.select{ |comment| comment.updated_at > @last_updated }
    end
  end
4

2 に答える 2

4

コードをモデルに移動し、モデルが1)存在するパラメーター、nilおよび2)ActiveRecordを使用してデータベースを効果的にクエリするようにする必要があります。

コントローラで、変数ごとに次のような行を作成します。

@friends = @user.friends.updated_since(params[:last_updated])

(システムの名前の一貫性を維持したいので、@buddiesここで名前を変更しました)@friends

次に、モデルで、そのロジックを実行Friendするというクラスメソッドを定義します。updated_since

class Friend < ActiveRecord::Base
  def self.updated_since(last_updated)
    if last_updated.present?
      where("updated_at > ?", last_updated)
    else
      all
    end
  end
end
于 2012-12-08T21:39:16.900 に答える
0

Rails 4.x を使用している場合、これを行う最もクリーンな方法はConcernsを使用することです。すべてのモデルで同じスコープをコピーして貼り付ける代わりに、一般的なスコープを作成して、必要なモデルに単純に含めることができます。

懸念から更新:

# my_app/app/models/concerns/updated_since.rb
module UpdatedSince
  extend ActiveSupport::Concern

  module ClassMethods
    def updated_since(time)
      if parsed_time = convert_time(time)
        where("updated_at >= ?", parsed_time)
      else
        all
      end
    end

    private

      def convert_time(time)
        Time.zone.parse(time) unless time.blank?
      rescue ArgumentError
        self.logger.warn "Invalid updated_since time: <#{time}>"
        nil
      end
  end
end

関連するモデルに含めます。

class Friend < ActiveRecord::Base
  include UpdatedSince
end

コントローラーで使用します。

@friends = @user.friends.updated_since(params[:last_updated])
于 2015-01-05T20:05:53.550 に答える