4

我正在充當地方目錄和應用程序分頁(目前是,但也許並不總是)允許基於1個城市的特定企業的場地過濾, 1個街區,1個類別。類別可以嵌套,因此它們具有parent_id。通過查看下面的模型代碼可以理解這些關聯(一切都相當簡單)。到目前爲止,一切運行順利,但還剩下一個障礙物。排序/成組記錄了許多基於關聯的限制

首先,這將影響到一些答案的重要說明。

1.我正在使用will_paginate來爲場地協會分頁。這就是說,我不能在數組上分頁。那麼,我可能,但表現將是一個問題。

2.我使用標記模型作爲業務及其關聯類別之間的鏈接對象。目前,該接口只允許設置一個類別附加到任何給定的業務,至少一個必須連接。我計劃以後擴大頁面,以允許多個類別過濾面向公衆的接口,這樣的變化無法對應用程序結構的這一部分,除非有一個多,完成這更好的方法

3.一種可能的解決方案,它威力(希望)存在是別名的表格加入阿雷爾或對自己一範圍允許分類自連接得到在父。目前,如果解決方案假設不會有超過1層的嵌套,我會發現它是可以接受的。儘管如此,這種犧牲是最後的選擇,因爲它將會阻礙我想在未來推出的功能。

4.相關的最後一點,我已經看過will_paginate/array,但被他們的免責聲明嚇跑了(「如果你知道你在做什麼,真的需要分頁陣列,明確需要此功能」) 。記住過去我嘗試推出自己的分頁插件時遇到的性能噩夢,我想避免這種情況,除非有人能夠充分向我解釋此類解決方案的性能影響。

5.這個網站需要能夠採取衝擊。目前,所有內容都被緩存,數據庫非緩存命中相對較少。它必須保持這種方式。現在

,這個問題我想提出。

背景:一些面向公衆的意見設計規範的要求,從目前全市所有場館將顯示在列表中,並通過父類別分組(無子將被顯示,但所有的場館是誰的企業'屬於子類別的標籤也應該與標籤屬於父母的場所一起分組)。然後這些場地按父類別排序,其次排序爲場地所屬商業的名稱。這需要一個平面關聯,然後輸入到will_paginate中。這個場地的ActiveRecord查詢,我將在下文中將其稱爲@venues,然後轉儲到JSON中,緩存並呈現給頁面。

問題:如何構建@venues與指定的分組/排序,以便這些場館可適當分頁,並根據該接口的規格顯示?

應用程序/模型/ business.rb

# Fields: id, name, description, keywords, ... 
class Business < ActiveRecord::Base 
    has_many :tags, :dependent => :destroy 
    has_many :categories, :through => :tags 

    has_many :venues, :dependent => :destroy 

    has_many :cities, :through => :venues 
    has_many :neighborhoods, :through => :venues 
end 

應用程序/模型/ venue.rb

# Fields: id, business_id, city_id, neighborhood_id, ... 
class Venue < ActiveRecord::Base 
    belongs_to :business 
    belongs_to :city 
    belongs_to :neighborhood 
end 

應用程序/模型/ tag.rb

# Fields: id, category_id, business_id, ... 
class Tag < ActiveRecord::Base 
    belongs_to :business 
    belongs_to :category 
    belongs_to :venue 
end 

應用程序/模型/ category.rb

# Fields: id, parent_id, name, description, ... 
class Category < ActiveRecord::Base 
    has_many :tags, :dependent => :destroy 
end 

應用程序/模型/ city.rb

# Fields: id, name, description, ... 
class City < ActiveRecord::Base 
    has_many :neighborhoods, :dependent => :destroy 
    has_many :venues 
end 

應用程序/模型/ neighborhood.rb

# Fields: id, city_id, name, description 
class Neighborhood < ActiveRecord::Base 
    belongs_to :city 
    has_many :venues 
    has_many :businesses, :through => :venues 
end 

這是一個需要解釋的問題,如果需要,我可以提供更多信息。

P.S.使用Rails 3.0.9爲這個應用程序使用MySQL。

P.S.S.我也對根據多個嵌套關聯字段的可能值簡化了這種過濾的模式或寶石感興趣。我會授予upvote + accept +賞金給任何人可以提供一個精確的解決方案,使用嵌套設置模型寶石,如Awesome Nested Set以這種方式進行分組/排序/分頁。

+1

關於點#3:如果您預計類別查找到多於寫,你應該看看[嵌套集模型(http://mikehillyer.com/articles/managing-hierarchical- data-in-mysql /)繼承。它將允許無限的嵌套深度,輕鬆包含子類別,並擺脫自我加入。乾杯! –

回答

3

不會顯示子類別,但所有業務標籤屬於子類別的場所也應與標籤屬於父級的場所進行分組。

作爲Xavier在評論中表示,您應該使用嵌套集合模型。我用這一個:

https://github.com/collectiveidea/awesome_nested_set

這一點讓我進行分頁的能力和排序像往常一樣:

module Category 
    extend ActiveSupport::Concern 
    included do 
    belongs_to :category 
    scope :sorted, includes(:category).order("categories.lft, #{table_name}.position") 
    end 

    module ClassMethods 
    def tree(category=nil) 
     return scoped unless category 
     scoped.includes(:category).where([ 
     "categories.lft BETWEEN ? AND ?",category.lft, category.rgt 
     ]) 
    end 
    end # ClassMethods 
end 

#then with some category 
@animals = Animal.tree(@mamal_category) 

,將讓你所有的食草動物,食肉動物,雜食動物等等等等和子子在一個SQL調用中的類別,它很容易分頁,可排序,因爲它是一個範圍。

另見:get all products of category and child categories (rails, awesome_nested_set)

相關問題