Добавление параметра в область

У меня есть запрос ActiveRecord, например:

@result = stuff.limit(10)

где материал является активным запросом записи, где указаны предложения, порядок и т.д.

Теперь я подумал, зачем передавать магические числа, подобные этому контроллеру? Как вы считаете хорошей практикой определить область действия "limit (10)" и использовать ее вместо этого? и как бы выглядел синтаксис?

Ответ 1

Область будет выглядеть как любая другая (хотя вы можете предпочесть метод класса), например,

class Stuff < ActiveRecord::Base
  def self.lim
    limit(3)
  end
end

> Stuff.lim.all
=> [#<Stuff id: 1, name: "foo", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
 #<Stuff id: 2, name: "bnar", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
 #<Stuff id: 3, name: "baz", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">]
> Stuff.all.length
=> 8

Если вы всегда (или "почти" всегда) хотите этот предел, используйте область по умолчанию:

class Stuff < ActiveRecord::Base
  attr_accessible :name, :hdfs_file

  default_scope limit(3)
end

> Stuff.all
=> [#<Stuff id: 1, name: "foo", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
 #<Stuff id: 2, name: "bnar", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
 #<Stuff id: 3, name: "baz", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">]
> Stuff.all.length
=> 3

Чтобы пропустить область по умолчанию:

> Stuff.unscoped.all.size
=> 8

Ответ 2

Есть действительно несколько способов сделать это, методы класса - это такие, как указано @Dave Newton. Если вы хотите использовать области действия, вот как:

scope :max_records, lambda { |record_limit|
  limit(record_limit)
}

Или с сильным синтаксисом лямбда в Ruby 1.9 "stabby" и несколькими аргументами:

scope :max_records, ->(record_limit, foo_name) {   # No space between "->" and "("
  where(:foo => foo_name).limit(record_limit)
}

Если вы хотите узнать более глубокие различия между областями и методами класса, посмотрите этот пост в блоге.

Надеюсь, это поможет. Ура!

Ответ 3

Нулевые области предназначены для этого

Scoping позволяет указать часто используемые запросы Arel, на которые можно ссылаться как вызовы методов для объектов или моделей ассоциации. С помощью этих областей вы можете использовать каждый ранее описанный метод, например, где, объединяется и включает. Все методы области будут возвращать объект ActiveRecord:: Relation, который позволит называть его дополнительные методы (например, другие области).

Источник: http://guides.rubyonrails.org/active_record_querying.html#scopes

Итак, если вы чувствуете, что есть некоторые общие запросы, которые у вас есть, или вам нужны какие-то цепочки в ваших запросах, которые являются общими для многих. Затем я предлагаю вам перейти на области, чтобы предотвратить повторение.

Теперь, чтобы ответить, как область будет выглядеть в вашем случае

class YourModel < ActiveRecord::Base
  scope :my_limit, ->(num) { limit(num)} 
  scope :your_where_condition, ->(num) { where("age > 10").mylimit(num) } 
end

Ответ 4

Параметры передачи в области Rails

Определение области

scope :name_of_scope, ->(parameter_name) {condition whatever you want to put in scope}

Метод вызова

name_of_scope(parameter_name)

Ответ 5

Область в модели Rails с параметром:

scope :scope_name, -> (parameter, ...) { where(is_deleted: parameter, ...) }  

Или:

scope :scope_name, lambda{|parameter, ...| where(is_deleted:parameter, ...)}