2015-11-06 2 views
0

Я использую жемчужину will_paginate в моем проекте Rails 4. Когда я рассматриваю предков объекта, возвращаемого из вызова paginate(), я думал, что увижу что-то связанное с will_paginate в списке предков, например, возможно WillPaginate::Collection, но я не вижу ничего подобного. Я смущен тем, как мой объект набирает методы, такие как current_page и total_pages, если will_paginate не появляется нигде в дереве родословной.Rails 4 будет разбивать предков

Например:

location = Location.first 
reviews = location.location_reviews.paginate(page: 1, per_page: 5) 

reviews.next_page # => 2 
reviews.total_pages # => 16 
reviews.total_entires # => 80 

Однако выход reviews.ancestors является:

[LocationReview(id: integer, title: string), LocationReview::GeneratedAssociationMethods, #<#<Class:0x007fd6623bec38>:0x007fd6623beda0>, ActiveRecord::Base, GlobalID::Identification, ActiveRecord::Store, ActiveRecord::Serialization, ActiveModel::Serializers::Xml, ActiveModel::Serializers::JSON, ActiveModel::Serialization, ActiveRecord::Reflection, ActiveRecord::NoTouching, ActiveRecord::Transactions, ActiveRecord::Aggregations, ActiveRecord::NestedAttributes, ActiveRecord::AutosaveAssociation, ActiveModel::SecurePassword, ActiveRecord::Associations, ActiveRecord::Timestamp, ActiveModel::Validations::Callbacks, ActiveRecord::Callbacks, ActiveRecord::AttributeMethods::Serialization, ActiveRecord::AttributeMethods::Dirty, ActiveModel::Dirty, ActiveRecord::AttributeMethods::TimeZoneConversion, ActiveRecord::AttributeMethods::PrimaryKey, ActiveRecord::AttributeMethods::Query, ActiveRecord::AttributeMethods::BeforeTypeCast, ActiveRecord::AttributeMethods::Write, ActiveRecord::AttributeMethods::Read, ActiveRecord::Base::GeneratedAssociationMethods, #<#<Class:0x007fd661d14e28>:0x007fd661d14ef0>, ActiveRecord::AttributeMethods, ActiveModel::AttributeMethods, ActiveRecord::Locking::Pessimistic, ActiveRecord::Locking::Optimistic, ActiveRecord::AttributeDecorators, ActiveRecord::Attributes, ActiveRecord::CounterCache, ActiveRecord::Validations, ActiveModel::Validations::HelperMethods, ActiveSupport::Callbacks, ActiveModel::Validations, ActiveRecord::Integration, ActiveModel::Conversion, ActiveRecord::AttributeAssignment, ActiveModel::ForbiddenAttributesProtection, ActiveRecord::Sanitization, ActiveRecord::Scoping::Named, ActiveRecord::Scoping::Default, ActiveRecord::Scoping, ActiveRecord::Inheritance, ActiveRecord::ModelSchema, ActiveRecord::ReadonlyAttributes, ActiveRecord::Persistence, ActiveRecord::Core, Object, ActiveSupport::Dependencies::Loadable, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject] 

Почему не существует класса, связанные с will_paginate в этой продукции?

ответ

0

Вы вызываете метод .paginate на location.location_reviews, который является коллекцией здесь. Согласно this line и this line исходного кода метода paginate, похоже, что метод paginate возвращает исходную коллекцию после применения опций (например, per_page).

Итак, я думаю, что это нормальное поведение в вашем случае, что location.location_reviews.paginate(page: 1, per_page: 5) вернет объект класса location.location_reviews.class.

paginate вернет все, что https://github.com/mislav/will_paginate/blob/74a6cd0197072903cd8b83744133744ff4b4c046/lib/will_paginate/array.rb#L30 вернется, и pager.replace метод определяется здесь: https://github.com/mislav/will_paginate/blob/74a6cd0197072903cd8b83744133744ff4b4c046/lib/will_paginate/collection.rb#L112-L134 , который возвращает исходный объект типа коллекции. Это доказывает, что поведение, которое вы видите, верное.

+0

Но 'отзывы.класса' возвращает' LocationReview :: ActiveRecord_Associations_CollectionProxy'. Должна ли она возвращать 'WillPaginate :: Collection'? – flyingL123

+0

Если вы видите эту строку кода: https://github.com/mislav/will_paginate/blob/74a6cd0197072903cd8b83744133744ff4b4c046/lib/will_paginate/array.rb#L16 , когда он вызывает 'arr.paginate', он возвращает массив после применения варианты страницы, например per_page, page и т. д. Итак, в вашем случае он должен вернуть объект класса 'location.location_reviews', который является тем, что вы получаете, и является нормальным поведением. –

+0

Эта строка фактически подтверждает, что она возвращает исходную коллекцию: https://github.com/mislav/will_paginate/blob/74a6cd0197072903cd8b83744133744ff4b4c046/lib/will_paginate/array.rb#L30 Но не 'WillPaginate :: Collection' –

Смежные вопросы