我正在开发一个新的 Rails 项目,在这个项目中我有产品和产品类别。
因此,这些类别彼此非常不同,例如,船、房屋、汽车。
汽车类别可能具有“Mph”、“型号”、“品牌”、“年份”等标准。房屋类别将包含“房间”、“年份”、“城市”、“邮政编码”等内容。
我希望这是非常动态的,以便我能够从后端面板添加/删除标准和添加/删除类别。
现在我的问题是,我一直在玩这个,我无法真正弄清楚这个概念的逻辑,我尝试了一些解决方案,但是它们非常奇怪而且效率很低。也许一些铁杆 Rails 编码器可以给我一个提示,如何解决这个难题?
所以我能想出的最好的解决方案是:
四种型号:
_______________________
| 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 和谷歌上都搜索了很多这样的问题,但我找不到这样的问题。
奥鲁夫尼尔森。