2013-12-11 31 views
0

呼叫同一頁面後,返回不同的ID。調用同一頁面時,爲什麼will_paginate#paginate包含不同的對象?

Product.paginate(per_page: 15, page: 100).pluck(:id) 
    (1.2ms) SELECT "products"."id" FROM "products" LIMIT 15 OFFSET 1485 
=> [37990, 37991, 37992, 37993, 37994, 37995, 37996, 37997, 37998, 37999, 38000, 38001, 38002, 38003, 38004] 

Product.paginate(per_page: 15, page: 100).pluck(:id) 
    (0.7ms) SELECT "products"."id" FROM "products" LIMIT 15 OFFSET 1500 
=> [38799, 38800, 38801, 38802, 38803, 38804, 38805, 38806, 38807, 38808, 38809, 38810, 38811, 38812, 38813] 

Product.paginate(per_page: 15, page:100).pluck(:id) 
    (3.0ms) SELECT "products"."id" FROM "products" LIMIT 15 OFFSET 1485 
=> [24513, 24514, 33230, 18489, 33509, 33510, 33511, 33512, 33513, 33514, 34250, 33515, 33516, 33517, 33518] 

我的產品型號:

class Product < ActiveRecord::Base 
    attr_accessible :brand_id, :description, :name, :db_ref, :packages_attributes, :photos_attributes, :published, :alias 

    # Relations 
    has_many :photos 
    accepts_nested_attributes_for :photos 
    has_many :cart_items 
    has_many :packages, inverse_of: :product 
    accepts_nested_attributes_for :packages, allow_destroy: true 
    has_many :prices, :through => :packages 
    has_many :group_assignments, as: :groupable 
    has_many :groups, through: :group_assignments 
    belongs_to :brand 
    belongs_to :business 

    # Callbacks 
    before_validation :inherit_business_id 
    before_create :set_default_alias 

    # Validations 
    validates_presence_of :name 
    validates_presence_of :business 
    validates_uniqueness_of :name, scope: [:brand_id, :business_id, :published] 
end 
+1

你可以發佈'pluck'的代碼嗎?我不知道這是否是答案,但我可以想到兩種可能性。首先,這兩個調用之間正在被插入到數據庫中。其次,參賽作品並沒有按照任何順序排列,所以他們的順序無法保證。在前1500個條目中,順序可能會在兩次搜索之間發生變化,導致第1500行不是我期望的那樣,我會認爲您希望在該查詢中使用ORDER BY products.id。 – RustyToms

+0

編輯該問題以顯示生成SQL語句的代碼。你認爲這可能會對訂購產生影響嗎? – cabe56

+0

我不明白'.pluck(:id)'部分。以下是[文檔](https://github.com/mislav/will_paginate)中的示例:'##執行分頁查詢: @posts = Post.paginate(:page => params [:page]) ##在頁面中顯示頁面鏈接: <%= will_paginate #或使用顯式的「每頁」限制: <%= will_paginate @posts%>' – RustyToms

回答

1

嘗試添加排序,看看是否能解決問題:

Product.order(:id).paginate(per_page: 15, page: 100).pluck(:id) 

發生了什麼事是結果被從數據庫返回的順序沒有保證,所以他們以未知的順序被退回。通過添加特定訂單,您可以保證每次都會返回相同的訂單。

+0

我還沒有找到任何更改數據庫。在調用paginate之前,我添加一個'order('id')'調用後,錯誤就會停止。 – cabe56

+0

添加'unscoped'不能解決問題。 – cabe56

+0

通過「錯誤」你的意思是未定義的方法'空?'或者這解決了原始問題? – Donovan

相關問題