Подтвердить что ты не робот

Как сделать динамическую область Rails 3 условной?

Я хотел бы сделать динамическую именованную область в rails 3 условной для аргументов, переданных в. Например:

class Message < AR::Base
  scope :by_users, lambda {|user_ids| where(:user_id => user_ids) }
end

Message.by_users(user_ids)

Однако я хотел бы иметь возможность вызывать эту область даже с пустым массивом user_ids, и в этом случае не применять туда. Причина, по которой я хочу сделать это внутри области, - это то, что я собираюсь объединить несколько из них вместе.

Как мне сделать эту работу?

4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос, вы можете:

scope :by_users, lambda {|user_ids| 
  where(:user_id => user_ids) unless user_ids.empty?
}

Однако

Я обычно использую scope для простых операций (для удобочитаемости и ремонтопригодности), что-то после этого, и я просто использую методы класса, поэтому что-то вроде:

class Message < ActiveRecord::Base

  def self.by_users(users_id)
    if user_ids.empty?
      scoped
    else
      where(:user_id => users_id)
    end
  end

end

Это будет работать в Rails 3, потому что where фактически возвращает ActiveRecord::Relation, в котором вы можете связать больше запросов.

Я также использую #scoped, который вернет анонимную область, которая позволит вам связывать запросы.

В конце концов, это зависит от вас. Я просто даю вам варианты.