如何使用此动态生成的字段保存模型?
时间:2020-03-06 14:29:58 来源:igfitidea点击:
我有一个看起来像这样的Rails模型:
class Recipe < ActiveRecord::Base
has_many :ingredients
attr_accessor :ingredients_string
attr_accessible :title, :directions, :ingredients, :ingredients_string
before_save :set_ingredients
def ingredients_string
ingredients.join("\n")
end
private
def set_ingredients
self.ingredients.each { |x| x.destroy }
self.ingredients_string ||= false
if self.ingredients_string
self.ingredients_string.split("\n").each do |x|
ingredient = Ingredient.create(:ingredient_string => x)
self.ingredients << ingredient
end
end
end
end
这个想法是,当我从网页上创建成分时,我传入ingredients_string并让模型将其全部整理出来。当然,如果我要编辑成分,则需要重新创建该字符串。错误的本质是:我如何(优雅地)通知Ingredient_string的视图,并且仍然查看是否在set_ingredients方法中定义了ingredient_string?
解决方案
一起使用这两个可能会引起问题。两者都试图定义一个可以做不同事情的ingredients_string方法。
attr_accessor :ingredients_string
def ingredients_string
ingredients.join("\n")
end
摆脱" attr_accessor"," before_save"," set_ingredients"方法,并定义自己的" ingredients_string ="方法,如下所示:
def ingredients_string=(ingredients)
ingredients.each { |x| x.destroy }
ingredients_string ||= false
if ingredients_string
ingredients_string.split("\n").each do |x|
ingredient = Ingredient.create(:ingredient_string => x)
self.ingredients << ingredient
end
end
end
注意,我只是借用了我们对set_ingredients的实现。可能有一种更优雅的方法来分解字符串并根据需要创建/删除"成分模型"关联,但是已经很晚了,我现在想不起来。 :)
先前的答案非常好,但是可以做一些更改。
def Ingredients_string =(文本)Ingredients.each {| x | x.destroy}除非text.blank? text.split(" \ n")。each | x |
成分= Ingredient.find_or_create_by_ingredient_string(:ingredient_string => x)self.ingredients
我基本上只是修改了奥托的答案:
class Recipe < ActiveRecord::Base
has_many :ingredients
attr_accessible :title, :directions, :ingredients, :ingredients_string
def ingredients_string=(ingredient_string)
ingredient_string ||= false
if ingredient_string
self.ingredients.each { |x| x.destroy }
unless ingredient_string.blank?
ingredient_string.split("\n").each do |x|
ingredient = Ingredient.create(:ingredient_string => x)
self.ingredients << ingredient
end
end
end
end
def ingredients_string
ingredients.join("\n")
end
end

