我对rails非常陌生,我试图在我的应用程序中实现这些东西,但我不确定如何继续以及哪些方法最好。
我想有不同类型的活动,如餐厅,健身房,商店,ecc。 所有这些类型的活动都有相同的基础'属性,如姓名,城市,地址,电子邮件,但例如餐厅也可以有食物类型'属性或健身房可以有'课程'。 我在考虑不创建不同的模型,因此不同的表具有冗余属性,但创建基本模型'活动'然后是' store',' gym'等的模特。
什么是最佳解决方案,我该如何实现?我查找了STI和多重继承表,但我不确定它们是否合适以及哪种解决方案最佳。
答案 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属性。
但这只是基于我对你的问题的理解......对你实际想做的事情似乎有不同的解释。