具有几乎相同属性的模型

时间:2014-10-22 20:49:32

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

我对rails非常陌生,我试图在我的应用程序中实现这些东西,但我不确定如何继续以及哪些方法最好。

我想有不同类型的活动,如餐厅,健身房,商店,ecc。 所有这些类型的活动都有相同的基础'属性,如姓名,城市,地址,电子邮件,但例如餐厅也可以有食物类型'属性或健身房可以有'课程'。 我在考虑不创建不同的模型,因此不同的表具有冗余属性,但创建基本模型'活动'然后是' store',' gym'等的模特。

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

3 个答案:

答案 0 :(得分:3)

你的问题有点模糊,但听起来好像你想要使用关系,而不是继承。

一个类(或rails MVC范例中的模型)可以拥有或属于另一个或多个模型。这被称为关系。模型不会相互继承(尽管其他用例也可以。)它们之间只有彼此之间的关系,就像数据库表之间可以建立关系一样。实际上,关系是如何声明模型的基础数据库表之间的关系。

地址不是唯一与健身房有关的模型。健身房也是企业,因此belongs_to是商务舱。它只有一个地址,因此它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商业模式。

一个类可以属于多个其他类。一个类可以拥有另一个类,或者它有许多另一个类。 (还有_and_belongs_to_many,这有点复杂。)

所以这是你的健身房模型:

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

假设您设置了商家和地址之间的关系,您可以获得健身房的母公司的地址属性:

gym_one.business.address.city

现在你有一个健身课,你不必在每个班级重复你的属性。您只需在迁移中添加健身房特有的属性:

在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

答案 1 :(得分:0)

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

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

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

将此与STI相结合并根据模型(餐厅,健身房)对属性进行约束 - 使用验证进行检查

答案 2 :(得分:0)

没有一般的&#34;最佳解决方案&#34;。哪种概念最适合您的应用程序并不容易确定。至少不是没有关于你计划的更具体的细节。

根据您的基本属性示例,我建议将它们移动到自己的模型中。城市和地址将使位置模型,电子邮件(以及可能的其他通信细节)可能适合于联系模型等。通过多态关联,可以通过不同的表轻松地引用这些模型。这样只会在所有表中都存在name属性。

但这只是基于我对你的问题的理解......对你实际想做的事情似乎有不同的解释。