如何列出属于另一个模型的所有模型?

时间:2016-06-27 18:42:05

标签: ruby-on-rails ruby foreign-keys

我为餐馆建立了一个小型系统。

我目前坚持有效列出属于product_type类型的所有模型:foodbeveragesapparel_items

每种产品类型都有多种属于它们的产品,例如food有很多wraps,很多salads,很多sandwiches等。

这一点就是为每个产品类型设置一个按钮,根据所选类型的ID,点击后,将所有属于它的模型列为按钮,然后依次点击它们中的任何一个然后列出相关模型的数据库记录。

示例:食品,饮料=>点击食物=>显示按钮:包裹,沙拉和三明治=> click wraps =>列出所有包装

class ProductType < ActiveRecord::Base
  has_many :apparel_items
  has_many :chapata_items
  has_many :combos
  has_many :croissants
  has_many :fruits
  has_many :green_challenges
  has_many :hot_drinks
  has_many :infusions
  has_many :juices
  has_many :molletes
  has_many :omelettes
  has_many :salads
  has_many :sandwiches
  has_many :shakes
  has_many :sincronizadas
  has_many :slices
  has_many :smooth_drinks
  has_many :super_drinks
  has_many :water_drinks
  has_many :wrap_items
end

如何列出属于另一个模型的所有模型,以便我可以有效地编程?

为每种产品类型(食品,饮料,服装产品)创建模型并仅使这三种产品属于产品类型模型会更好吗?

2 个答案:

答案 0 :(得分:1)

您可以使用ActiveRecord::Reflection检查任何模型的关联。

所以Food.reflect_on_all_associations(:has_many)会返回一个ActiveRecord::Reflection::HasManyReflection个对象数组,每个食物类型都有一个Food模型has_many。每个反射都有一个名称,这是您在声明has_many关系时设置的名称。

然后,您可以使用这些反射的名称来构建产品列表,如下所示:

food_product_types = Food.reflect_on_all_associations(:has_many).map(&:name)

# 'food_product_types' equals [:wraps, :salads, :sandwiches, etc...]
# Now, create buttons for each food product type

当然,如果您的产品类型的关联不是产品,则需要将其过滤掉。

答案 1 :(得分:1)

您的架构当然可以从一些非规范化中受益。有许多方法可以实现设计,包括建议您为产品组分离模型。

但是,更重要的是,您应该考虑为什么要将所有各种产品放入单独的模型中。它们与使用它们的工作流程的立场真的不同吗?

也许值得保留Product模型中真正共享的字段集并将所有其他属性放入Attribute模型中?然后product_type将成为Product的一个字段,您将能够以简单明了的方式完成许多精彩的工作。