1

Arelチェーンのブロックがあるかどうか、またはこのDRYを作成するためのより良い方法があるかどうかわからないため、、、、、およびメソッドを複製includesしています。三項演算子で長い文字列を使用せずに、paramsでspecialty_idまたはfacility_idを簡単にテストできるものはありますか?whereorderpaginatewhere

class << self
  def list(options = {})

    facility_id  = options[:facility_id]  || nil
    keywords     = options[:keywords]     || nil
    page         = options[:page]         || nil
    specialty_id = options[:specialty_id] || nil
    jobs         = self.arel_table

    unless keywords.nil?
      keywords = keywords.downcase.tr_s('^a-z0-9 ', '').tr_s(' ', '\%')
    end

    if !specialty_id.blank?
      approved.
          includes(:facility, :specialties, :videos).
          where(jobs[:name].matches("%#{keywords}%")).
          where(specialties: {id: specialty_id}).
          order(jobs[:name]).
          paginate(page: page, per_page: 20)
    elsif !facility_id.blank?
      approved.
          includes(:facility, :specialties, :videos).
          where(jobs[:name].matches("%#{keywords}%")).
          where(facilities: {id: facility_id}).
          order(jobs[:name]).
          paginate(page: page, per_page: 20)
    else
      approved.
          includes(:facility, :specialties, :videos).
          where(jobs[:name].matches("%#{keywords}%")).
          order(jobs[:name]).
          paginate(page: page, per_page: 20)
    end

  end
end
4

2 に答える 2

2
query = approved
query = query.includes(:facility, :specialties, :videos)
query = query.where(jobs[:name].matches("%#{keywords}%")) if jobs[:name].present?
query = query. ...
query = query.paginate(page: page, per_page: 20)
query.to_a
于 2012-04-24T21:23:47.423 に答える
1

これらを連鎖させて、実行前に構築できるはずです。

このようなことが可能になるはずです:

scoped.tap do |query|
  query.
    approved.
    includes(:facility, :specialties, :videos).
    where(jobs[:name].matches("%#{keywords}%"))

  query.where(specialties: { id: specialty_id }) if specialty_id.present?
  query.where(facilities: { id: facility_id })   if facility_id.present?

  query.order(jobs[:name]).paginate(page: page, per_page: 20)
end

詳細については、こちらscopedを参照してください。

于 2012-04-24T22:21:39.027 に答える