铁轨上的巨型车型?这样做的适当方法是什么?

时间:2016-10-27 14:30:24

标签: ruby-on-rails

我正在练习,并提出一个想法,我应该创建一个实验,包括构建一个编辑器,可以定制一辆真正的汽车可以拥有的所有部件的真车。然后允许用户单独将其自定义为最精细的细节,只需使用true或false 然后输出相应的内容,如:

<%= if @vehicle.steering_wheel_color == blue %>
  show a blue steeringhweel
<% end %>

<%= if @vehicle.steering_wheel_color == red %>
  show a red steeringhweel
<% end %>

<%= if @vehicle.gear_box_knob == brown_wood %>
  show a brown wooden gear knob
<% end %>

由于我们大约谈论了大约500-1000个参数(?)我确信我对架构的看法很糟糕,所以我想知道什么是正确的&#39;&#39; ;甚至最好的方式这样做会是什么?考虑到每个变量都需要可查询?

我做了一些谷歌搜索,我发现一个答案建议做一个属于包含所有布尔值的车辆的车型。但后来我问了一位朋友,他说这将是一个糟糕的主意。

我想我的问题是,建立一个庞大的汽车编辑器的好方法是什么?

1 个答案:

答案 0 :(得分:1)

我建议virtus和jsonb db字段作为可能的起点。如果您安装了virtus gem,那么您可以设置一个名为CarSettings的伪模型。这看起来像是:

class CarSettings
  include Virtus.model

  attribute :steering_wheel_color, String, default: ''
  attribute :gear_box_knob, String, default: ''
  attribute :has_spoiler, Boolean, default: false
  ...

  def self.dump(settings)
    settings.to_hash
  end

  def self.load(settings)
    new(settings)
  end
end    

然后将这些设置序列化到您的Car(或其他)类中的json,如下所示:

class Car < ApplicationRecord
  (stuff)
  serialize :settings, CarSettings
end

然后您可以使用标准的RoR AR访问器来进行设置:

car.settings.steering_wheel_color = ...

不确定你是如何计划从仅仅布尔语中获得steering_wheel_color,但也许你想为每个&#34;事情设置枚举选项。并使用下拉列表而不是复选框来呈现?我为此使用了classy_enum gem,但是常规枚举也可以使用。

修改

忘记了汽车模型中你需要的一些东西:

class Car < ApplicationRecord
  ...

  attr_accessor :steering_wheel_color, :gear_box_knob, etc

  def method_missing(m, *args, &block)
    self.settings.send(m, *args, &block)
  end

  def respond_to_missing?(method_name, include_private = false)
    names = CarSettings.attribute_set.map { |a| a.name }
    names.include? method_name
  end
end

在Rails 4.2中,这在没有attr_accessors的情况下工作,但是,由于Rails 5中的某些原因,在尝试执行.update_attributes(car_params)时,它会在没有attr_accessors的情况下给出未知的属性错误。仍然试图确定改变的原因,但attr_accessors现在仍然有用。