这是关于处理模型字段的一般性问题,只是想知道这是否是正确的方法。假设我有模型House
,用户可以选择10种功能:
Swimming Pool
Hot Tub
Tennis Court
Boat Parking
Horse Facilities
Balcony
Pets Allowed
Energy Efficient
Lease Option
Disability Features
这意味着我必须制作10个布尔列吗?我从未使用过如此多的表格列,所以我不确定。拥有这么多人是正常的做法吗?
谢谢。
答案 0 :(得分:6)
另一个选择是拥有一个名为HouseOptions(或任何你喜欢的)的表,然后是一个名为UserHouseOptions的连接表。
AR关系看起来像:
# user.rb
has_many :user_house_options
has_many :house_options, :through => :user_house_options
# user_house_options.rb
belongs_to :user
belongs_to :house_options
# house_options.rb
has_many :user_house_options
has_many :users, :through => :user_house_options
然后,用户没有额外的列。它只是通过AR关系连接表。用户住宅选项将包含两列:user_id和house_options_is。然后House选项只有字符串列(“游泳池”等),它只是一个参考表。
查看此Rails指南,了解有关has_many的更多信息:通过关系(和示例代码): http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association
答案 1 :(得分:4)
我对字段数量并不感到惊慌,但您可能想要概括设计,以便轻松实现新功能。
他是设计的一个想法。
> rails generate Model Feature type:string house_id:integer
class House < ActiveRecord::Base
has_many :features
end
class Feature < ActiveRecord::Base
belongs_to :house
end
class SwimmingPool < Feature
def to_s
"Swimming Pool"
end
end
house = House.create
house.features << SwimmingPool.new
house.save!
house.features.each do |feature|
puts feature
end
答案 2 :(得分:2)
这可能是可行的,但实现代码可能会很混乱。 一种可能的解决方案是序列化
class User < ActiveRecord::Base
serialize :preferences
end
user = User.create(:preferences => { "background" => "black", "display" => large })
User.find(user.id).preferences # => { "background" => "black", "display" => large }
这里我们使用的首选项只是一个哈希,但你也可以使用数组
另一个解决方案,为每个功能创建一个表并使用连接,但这可能会更加混乱。当我更多地思考时,我会更新我的答案
答案 3 :(得分:2)
我的另一个答案(使用多态类)只是一个想法。另一种更简单的方法是使用feature_types表,在名称字段中列出游泳池,以及多对多链接表。见has_many:through。
此表解决方案可以轻松扩展以添加其他类型。
多态类解决方案是可扩展的,如果要扩展特定于类的行为。例如,游泳池可能在to_s基础上包含特征表中质量数据的“奥林匹克大小”等数据。
答案 4 :(得分:1)
这取决于您可以创建一个数组字段的用途,例如称为功能,您可以插入房子在该阵列中的功能类型。