【问题标题】:Models with almost same attributes具有几乎相同属性的模型
【发布时间】:2014-10-23 07:07:38
【问题描述】:

我对 Rails 很陌生,我正在尝试在我的应用程序中实现这些东西,但我不确定如何进行以及最好的方法。

我想参加不同类型的活动,例如餐厅、健身房、商店、ecc。 所有这些类型的活动都具有相同的“基本”属性,例如姓名、城市、地址、电子邮件,但例如餐厅也可以具有“食物类型”属性,或者健身房可以具有“课程”。 我在考虑不创建不同的模型和具有冗余属性的不同表,而是创建一个基本模型“活动”,然后创建“商店”、“健身房”等模型。

什么是最好的解决方案,我该如何实现?我查找了 STI 和多重继承表,但我不确定它们是否合适以及哪种解决方案最好。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    您的问题有点含糊,但听起来您确实想使用关系,而不是继承。

    一个类(或 Rails MVC 范例中的模型)可以拥有或属于另一个或多个模型。这叫关系。这些模型不会相互继承(尽管这对于其他用例来说是可能的。)它们只是相互之间有关系,就像数据库表可以在它们之间建立关系一样。实际上,关系是您为模型声明底层数据库表之间关系的方式。

    Address 不是唯一与健身房有关的模型。健身房也是企业,所以它@98​​7654321@ 是商务舱。它有只有一个地址,所以它是has_one 地址。

    您创建的模型每个都有自己的属性(属性是通过迁移创建的)。如何设置它们取决于您的需求。由于您的健身房必须有一个地址,因此您创建一个包含地址属性的地址模型:

    class Address
      # your attributes are in the database as created by your migration(s). You don't need to list them in the class.
      # validations, methods, etc.
    end`
    

    然后,您可以将地址模型用于具有地址的任何内容。您无需在每个类中都包含地址属性来重复自己。

    然后在模型类中设置 Gym 和 Address 和 Business 的关系。

    由于您的健身房是一家企业,(您的全球企业集团中的众多企业之一:)您声明它belongs_to 是商业模式。

    一个类可以属于多个其他类。一个类可以有另一个类中的一个,也可以有许多其他类。 (还有has_and_belongs_to_many,稍微复杂一点。)

    这是你的 Gym 模型:

    class Gym
    
      belongs_to :business
    
      has_one :address
      has_many :employees
      has_many :members
      #rest of Gym class
    
    end
    

    现在您可以像这样引用健身房的地址:

    gym_one.address.line_1
    gym_one.address.line_2
    gym_one.address.ship_attention
    gym_one.address.city
    gym_one.address.state
    gym_one.address.zip
    gym_one.address.country
    

    您还可以参考健身房属于您的哪一家企业:

    gym_one.business
    

    假设你设置了business和address的关系,你可以得到gym的父business的address属性:

    gym_one.business.address.city
    

    现在您有了 Gym 课程,您不必在每个课程中都重复您的属性。您只需在迁移中添加健身房独有的属性:

    在 db/migrations/{date_code}_create_gym 中:

    class Gyms < ActiveRecord::Migration
      def change
        create_table :gyms do |t|
          t.string :name
          # Other attributes that only a gym has. Not attributes of things that have a relation to Gym
        end
      end
    end
    

    【讨论】:

    • 感谢您的回答。如果我添加一个“项目”模型怎么办?健身房、商店、餐厅等可以创建项目。在模型项中添加“belongs_to gym、belongs_to store、belongs_to restaurant等”是否正确?
    • 我的意思是,有没有办法避免物品表中出现“store_id、gym_id、restaurant_id”?因为例如,如果健身房创建了一个项目,那么数据库中的该条目将具有“gym_id”值,但“store_id”和“restaurant_id”为空白。
    • 一个商店可以有很多商品,因此您可以将has_many :items 添加到商店。不要将belongs_to :store 添加到商品,因为商品不是商店。
    • 如果我想跟踪某个项目所属的活动(酒吧、健身房、商店)怎么办?
    • 您可能想要搜索“rails has and belongs to many”。如果您使用的是 Rails 3+,请跳过早期版本的任何内容。 HABTM 使用连接表来跟踪商店和商品之间的多对多关系。如果您不熟悉连接表(我们都曾不熟悉!),您可能想研究数据库关系是如何工作的。 Rails 模型为我们提供了一种“在后台”与数据库关系进行交互的简单方法,但您仍然必须了解数据库表如何相互关联。祝你好运!
    【解决方案2】:

    我相信你可以在这里使用关系。

    您可以拥有名为 Attribute 的模型,该模型具有 id 和 name。然后创建名为 AttributeValue 的模型 - 它属于属性和餐厅、健身房、商店等。活动将有许多属性值和许多属性 - 通过属性值。

    然后您将拥有动态属性 - 无需重复数据。

    将此与 STI 相结合,并为每个模型(餐厅、健身房)定义属性约束 - 使用验证进行检查

    【讨论】:

      【解决方案3】:

      没有通用的“最佳解决方案”。哪个概念最适合您的应用程序并不容易确定。至少在没有关于你计划的更具体细节的情况下。

      根据您的基本属性示例,我建议将它们移到自己的模型中。 city 和 address 将构成位置模型,电子邮件(可能还有其他通信细节)可能适合联系人模型等。这些模型可以很容易地通过多态关联被不同的表引用。这将只留下 name 属性出现在所有表中。

      但这只是基于我对你的问题的理解......对于你真正想要做什么似乎有不同的解释。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        • 2022-07-11
        相关资源
        最近更新 更多