Rails: 多种模型的优缺点
Rails: Pros and Cons of multiple models
我是 运行 一个 Rails 4 应用程序,我对如何构建它有疑问。我的应用程序有 users
。这些用户有很多可以归类的字段,例如Personal Info
、Work Info
、Home
等
我的问题涉及我是否应该为这些子组中的每一个制作单独的模型以便 users
有很多 has_one
关联,或者只是按以下方式命名字段:personal_info_name
, personal_info_address
, work_info_address
, 等等
以下是我对模型分组的一些想法:
优点:
- 组织
- 可读性
缺点:
- 占用更多数据库space
- 更多型号意味着更多files/overhead
是否有 "Rails-way" 可以做 this/what 是否有其他一些 pros/cons 用于拥有多个模型?
P.S。
我读过一些关于 "fat model, skinny controller" 的想法,但我不确定我是否完全理解它们(如果它们与问题有关)。
好的,这只是众多方法之一。我通常创建一个 Profile
模型,它属于一个用户。一个用户可以拥有一个 Profile
,或者,如果这个应用程序要发展并允许一个用户管理多个属性,它以后可能会有很多配置文件。在这些配置文件中,您可以使用 PGSQL HStore (tutorial here) 存储许多小的首选项(tel1、tel2、address、address_work 等)以防止数据库混乱。祝你好运!
您仍然应该使用适当的 has_one
关系,但利用 ActiveRecord delegate
s 来创建快捷方式:
class User < ActiveRecord::Base
has_one :personal_info, ...
has_one :work_info, ...
delegate :personal_info_name, to: 'personal_info.name'
delegate :personal_info_address, to: 'personal_info.address'
delegate :workd_info_address, to: 'work_info.address'
end
当然,假设您使用 Active Record 作为 ORM。否则,您可以选择手动路线:
class User
attr_accessor :personal_info, :work_info
def personal_info_name
personal_info.name unless personal_info.nil?
end
def personal_info_address
personal_info.address unless personal_info.nil?
end
def work_info_address
work_info.address unless work_info_address.nil?
end
end
我是 运行 一个 Rails 4 应用程序,我对如何构建它有疑问。我的应用程序有 users
。这些用户有很多可以归类的字段,例如Personal Info
、Work Info
、Home
等
我的问题涉及我是否应该为这些子组中的每一个制作单独的模型以便 users
有很多 has_one
关联,或者只是按以下方式命名字段:personal_info_name
, personal_info_address
, work_info_address
, 等等
以下是我对模型分组的一些想法:
优点:
- 组织
- 可读性
缺点:
- 占用更多数据库space
- 更多型号意味着更多files/overhead
是否有 "Rails-way" 可以做 this/what 是否有其他一些 pros/cons 用于拥有多个模型?
P.S。
我读过一些关于 "fat model, skinny controller" 的想法,但我不确定我是否完全理解它们(如果它们与问题有关)。
好的,这只是众多方法之一。我通常创建一个 Profile
模型,它属于一个用户。一个用户可以拥有一个 Profile
,或者,如果这个应用程序要发展并允许一个用户管理多个属性,它以后可能会有很多配置文件。在这些配置文件中,您可以使用 PGSQL HStore (tutorial here) 存储许多小的首选项(tel1、tel2、address、address_work 等)以防止数据库混乱。祝你好运!
您仍然应该使用适当的 has_one
关系,但利用 ActiveRecord delegate
s 来创建快捷方式:
class User < ActiveRecord::Base
has_one :personal_info, ...
has_one :work_info, ...
delegate :personal_info_name, to: 'personal_info.name'
delegate :personal_info_address, to: 'personal_info.address'
delegate :workd_info_address, to: 'work_info.address'
end
当然,假设您使用 Active Record 作为 ORM。否则,您可以选择手动路线:
class User
attr_accessor :personal_info, :work_info
def personal_info_name
personal_info.name unless personal_info.nil?
end
def personal_info_address
personal_info.address unless personal_info.nil?
end
def work_info_address
work_info.address unless work_info_address.nil?
end
end