【问题标题】:Rails 4 will paginate ancestorsRails 4 将为祖先分页
【发布时间】:2015-11-07 00:51:29
【问题描述】:

我在 Rails 4 项目中使用 will_paginate gem。当我查看调用paginate()返回的对象的祖先时,我以为我会在祖先列表中看到与will_paginate相关的东西,例如,可能是WillPaginate::Collection,但我没有看到这样的东西。如果 will_paginate 没有出现在祖先树中的任何位置,我很困惑我的对象如何获得像 current_pagetotal_pages 这样的方法。

例如:

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 相关的类?

【问题讨论】:

    标签: ruby-on-rails ruby pagination will-paginate


    【解决方案1】:

    您正在调用location.location_reviews 上的.paginate 方法,这是这里的集合。根据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 它返回原始集合类型对象。这证明你看到的行为是正确的。

    【讨论】:

    • 但是reviews.class 返回LocationReview::ActiveRecord_Associations_CollectionProxy。它不应该返回WillPaginate::Collection吗?
    • 如果你看到这行代码:github.com/mislav/will_paginate/blob/… 当它调用arr.paginate 时,它会在应用分页选项后返回一个数组,例如per_page、page 等。所以,在你的情况下,它应该返回一个 location.location_reviews 类的对象,这是你得到的并且是正常行为。
    • 这一行实际上证实了,它返回原始集合:github.com/mislav/will_paginate/blob/… 但是,不是WillPaginate::Collection
    • 我还是一头雾水。您提供的链接中的 cmets 说:“结果是一个 WillPaginate::Collection 实例,它是一个具有更多关于其分页状态的属性的数组。”所以听起来它仍然应该返回一个WillPaginate::Collection。我也不明白如何将所有这些方法注入到 ActiveRecord 集合的常规行为中,而不会在祖先链中看到与 will_paginate 相关的内容。如果你不知道的话,我对 Ruby 和 Rails 还是很陌生。
    • 确实评论有点混乱,但这里的例子:github.com/mislav/will_paginate/blob/… 清楚地表明它返回原始集合类型对象。此外,您的发现 (reviews.class returns LocationReview::ActiveRecord_Associations_CollectionProxy) 支持这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多