在这种情况下我应该有多少列?

时间:2012-05-09 14:55:40

标签: ruby-on-rails model-view-controller

这是关于处理模型字段的一般性问题,只是想知道这是否是正确的方法。假设我有模型House,用户可以选择10种功能:

Swimming Pool
Hot Tub
Tennis Court
Boat Parking
Horse Facilities
Balcony
Pets Allowed
Energy Efficient
Lease Option
Disability Features

这意味着我必须制作10个布尔列吗?我从未使用过如此多的表格列,所以我不确定。拥有这么多人是正常的做法吗?

谢谢。

5 个答案:

答案 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)

这取决于您可以创建一个数组字段的用途,例如称为功能,您可以插入房子在该阵列中的功能类型。