所以,假设你有
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在表单上是空白的。
我不确定纠正上述问题的最佳方法是什么,这是我认为需要完全重构的最后一个转折点。
如果有人能提供任何反馈意见那么好。
谢谢!
答案 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
这真的不是那么糟糕,只是没有超级简单的方法来做到这一点。我希望你在某些时候在这些文本字段上放置自动填充功能。