我觉得这需要重构 - 任何帮助? Ruby建模

时间:2009-12-11 13:04:47

标签: ruby-on-rails modeling

所以,假设你有

line_items

和line_items属于品牌和型号

一个品牌有很多型号和订单项

模型属于make

对于裸示例的想法LineItem.new(:make =>“Apple”,:model =>“Mac Book Pro”)

创建LinteItem时,您需要一个make和model的text_field框。制作和模型不应该存在多次。

所以我使用了以下实现:

before_save :find_or_create_make, :if => Proc.new {|line_item| line_item.make_title.present? }
before_save :find_or_create_model

def find_or_create_make
  make = Make.find_or_create_by_title(self.make_title)
  self.make = make
end

def find_or_create_model
  model = Model.find_or_create_by_title(self.model_title) {|u| u.make = self.make}
  self.model = model
end

但是,使用此方法意味着我必须运行自定义验证而不是#validates_presence_of:make,因为虚拟属性发生了关联

validate :require_make_or_make_title, :require_model_or_model_title

def require_make_or_make_title
  errors.add_to_base("Must enter a make") unless (self.make || self.make_title)
end

def require_model_or_model_title
  errors.add_to_base("Must enter a model") unless (self.model || self.model_title)
end
嗯,这开始变得糟透了。现在真的很糟糕的是使用表单进行编辑。考虑到我的表单字段是部分字段,我的编辑呈现与新表单相同的表单。这意味着:make_title和:model_title在表单上是空白的。

我不确定纠正上述问题的最佳方法是什么,这是我认为需要完全重构的最后一个转折点。

如果有人能提供任何反馈意见那么好。

谢谢!

1 个答案:

答案 0 :(得分:1)

我不认为line_items应该属于make,它们应该只属于一个模型。一个模型应该有很多行项目。 make可以通过模型包含许多订单项。您缺少几种方法来显示您的字段。

class LineItem
  belongs_to :model
  after_save :connect_model_and_make
  def model_title
     self.model.title
  end
  def model_title=(value)
     self.model = Model.find_or_create_by_title(value)
  end
  def make_title
     self.model.make.title
  end
  def make_title=(value)
     @make = Make.find_or_create_by_title(value)  
  end
  def connect_model_and_make
     self.model.make = @make
  end
end
class Model
  has_many :line_items
  belongs_to :make
end
class Make
  has_many :models
  has_many :line_items, :through => :models
end

这真的不是那么糟糕,只是没有超级简单的方法来做到这一点。我希望你在某些时候在这些文本字段上放置自动填充功能。