2013-03-05 12 views
15

Mam kwerendy ActiveRecord na przykład tak:Dodanie parametru do zakresu

@result = stuff.limit(10) 

gdzie materiał jest aktywny rekord z kwerendy, gdzie klauzule ORDER BY, itd ...

Teraz myślałem po co przekazywać kontrolerom magiczne liczby? Czy uważasz, że dobrą praktyką jest zdefiniowanie zakresu "limitu (10)" i użycie go zamiast tego? i jak wyglądałaby składnia?

+0

I nie sądzę, zakres jest istotne. Może stała w Model.rb, jeśli limit pojawia się w wielu miejscach (pozwala powiedzieć stałą 'MAX_ITEMS_PER_PAGE') – MrYoshiji

Odpowiedz

1

Zakres wyglądałby jak każdy inny (choć może wolisz metodę klasa), np

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 

Jeśli Ci zawsze (lub "prawie" zawsze) chce ten limit, należy użyć domyślnego zakresu:

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 

Aby pominąć domyślny zakres:

> Stuff.unscoped.all.size 
=> 8 
13

Well celownicze są przeznaczone dla tego

Scoping umożliwia określenie powszechnie używanych zapytań AREL które można odwoływać się jak nazywa metoda na skojarzenie obiektów lub modeli. Za pomocą tych zakresów można korzystać z wszystkich wcześniej omówionych metod, takich jak miejsce, połączenia i elementy. Wszystkie metody zasięgu zwrócą obiekt ActiveRecord :: Relation, który pozwoli na wywołanie na nim dalszych metod (na przykład innych zakresów).

Źródło: http://guides.rubyonrails.org/active_record_querying.html#scopes

Więc jeśli czujesz, że istnieją pewne wspólne pytania, które masz, czy trzeba jakąś łańcuchowym w zapytaniach, które są wspólne dla wielu. Następnie zasugeruję, abyś sięgnął po zakresy, aby zapobiec powtórzeniu.

teraz odpowiedzieć jaki zakres będzie wyglądać w przypadku

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

Istnieje wprawdzie wiele sposobów robi takie metody klasy są jedno jak podkreślił @Dave Newton. Jeśli chcesz korzystać z zakresów, oto jak:

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

Albo z Ruby 1.9 „stabby” lambda składnia i wieloma argumentami:

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

Jeśli chcesz wiedzieć głębsze różnice między zakresami i metodami klasy, sprawdź this blog post.

Mam nadzieję, że to pomaga. Twoje zdrowie!

+1

+1 za pokazanie, jak używać parametru; Nie byłem pewien, czy powinienem się tym przejmować, czy nie. –

+2

małe groszki w powyższym przykładzie z napisem lambda: nie ma spacji między operatorem stab a nawiasem otwierającym listę argumentów. – Jacob

+1

@Jacob Właśnie w to wpadłem. Edytujesz swoją odpowiedź, by usunąć przestrzeń. –

12

parametry przechodzą w zakresie Rails

Definicja zakresu

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

wywołanie metody

name_of_scope(parameter_name) 
0

Zakres w modelu Rails z parametrem:

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

Lub:

scope :scope_name, lambda{|parameter, ...| where(is_deleted:parameter, ...)} 
Powiązane problemy