0

我正在開發一個新的rails項目,並且在此項目中我有產品和產品類別。具有匹配產品的動態類別標準rails 3

所以這些類別是非常不同的彼此,一些名稱,船,房屋,汽車。

汽車類別可能有像「Mph」,「型號」,「品牌」,「年份」等標準。凡房屋類別將有像「房間」,「年」,「城市」,「郵政編碼」等。

我想這是非常動態的,這樣我就能夠添加/刪除標準並從後端面板添加/刪除類別。

現在對我的問題,我一直在玩這個,我不能真正弄清楚這個概念的邏輯,我嘗試了一些解決方案,但他們是非常奇怪的,相當低效。也許一些鐵桿鋼軌編碼器可以給我一個提示,關於如何解決這個難題?

所以最好的解決辦法,我能想出,是這樣的:

四種模式:

_______________________ 
| Product.rb   | 
----------------------- 
| id   | integer | 
----------------------- 
| category_id | integer | 
----------------------- 
| Title  | string | 
----------------------- 
| Description | text | 
----------------------- 

_______________________ 
| Category.rb   | 
----------------------- 
| id   | integer | 
----------------------- 
| Title  | string | 
----------------------- 
| Description | text | 
----------------------- 

_______________________ 
| Criteria.rb   | 
----------------------- 
| id   | integer | 
----------------------- 
| category_id | integer | 
----------------------- 
| Name  | string | 
----------------------- 
| Default  | string | 
----------------------- 
| Description | text | 
----------------------- 

_______________________ 
| ProductInfo.rb  | 
----------------------- 
| id   | integer | 
----------------------- 
| product_id | integer | 
----------------------- 
| Name  | string | 
----------------------- 
| Value  | text | 
----------------------- 

它是如何連接:

Criteria.rb is connected to Category.rb with a category_id and has_many/belongs_to relation 
Product.rb is connected to Category.rb with a category_id and has_many/belongs_to relation 
ProductInfo.rb is connected to Product.rb with a product_id and has_many/belongs_to relation. 
Category.rb is the heart og this solution. The category model, both have many products and criterias. 

如何它應該工作,在現實:

In the show category page, i would first print out all the criterias for the given category. 
Afterwards i would make a @products.each do |product|. 
In the @products.each block, i would make a @category.criterias.each do |criteria|. 
In the @category.criterias.each block, i would then run something like product.productinfos.where(:name => criteria.name). 
And then run it one by one. 

結論,這個解決方案做的工作,但我懷疑,這是最好的解決辦法。它會產生非常大的加載時間,高流量和許多數據。我將需要編寫非常奇怪且不可讀的代碼。

這是一個相當長的問題,它可能會很混亂,所以如果有什麼請說。此外,我已經搜索了很多像這樣的問題,無論是在Stackoverflow和谷歌,但我一直沒能找到像這樣的東西。

Oluf Nielsen。

回答

1

在我看來,最好不要定義額外的表來處理這個問題,因爲很多性能問題。我喜歡處理這樣的事情是在產品表中使用序列化的列。使用這種方法可以減少直接在數據庫中搜索的能力,但是不管怎樣,您都不想這樣做。爲了處理搜索,你必須添加某種索引搜索機制。像acts_as_ferret,甚至Solr或ElasticSearch。

如果您使用的是Postgres退房https://github.com/softa/activerecord-postgres-hstore

對於MySQL,使用內置的「商店」 http://api.rubyonrails.org/classes/ActiveRecord/Store.html

class Product < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
    store :settings 
end 

要爲每個類別設定的標準鐵軌的做同樣的事情到這一點:

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :products 


    def criteria 
    @criteria_list ||= self[:criteria].split('|') 
    @criteria_list 
    end 

    def criteria=(names) 
    self[:criteria] = names.join('|') 
    end 

end 

每次將產品添加到某個類別時,檢查該類別中的所有條件是否有效能夠在產品的屬性中使用散列鍵。如果不是,則根據需要添加默認值。

您還可以使用proc動態獲取產品類別的所有條件字段中的存取器名稱來爲屬性散列存儲設置存取器? (不知道這一點,因爲我以前沒有這樣做過)

您還可以使用產品表中的類型字段使用STI(單表繼承)。 (有據可查)這種方法稍好一些,因爲當產品從一個類別轉移到另一個類別時,屬性不會改變。

class Gadget < Product 
    store_accessor :manufacturer, :model 
end 

class Phone < Gadget 
    store_accessor :os, :touch_screen, :is_smart 
end 

希望這有助於

0

否則,第二個辦法是去同一個NoSQL資料庫。嘗試與mongoid,這是非常穩定的mogodb。這將很好地滿足您對變量屬性的要求。您也可以在以後輕鬆添加其他任何類別。

據我所知,使用mysql,你最終會創建多個數據庫來存儲這個動態數據,而這會影響性能。

更新 -

從您的數據可以與NoSQL的靈活點

除此之外,還有你需要有轉移之前,需要考慮很多事情。我只是建議你根據事實需要靈活的數據庫結構。從mogodb文檔開始,它們是很好的起點。

相關問題