2015-11-06 49 views
0

我在我的Rails 4項目中使用了will_paginate gem。當我查看從調用paginate()返回的對象的祖先時,我想我會在祖先列表中看到與will_paginate相關的內容,例如,可能是WillPaginate::Collection,但我沒有看到類似的內容。如果will_paginate不出現在血統樹的任何位置,我很困惑我的對象如何獲得像current_pagetotal_pages這樣的方法。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這是在這裏的集合。根據paginate方法的源代碼的this linethis line,似乎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

但'reviews.class'返回'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' –