Ruby on rails 如何存储一条记录并在其他表中多次引用它?

Ruby on rails 如何存储一条记录并在其他表中多次引用它?,ruby-on-rails,database-design,activerecord,normalization,Ruby On Rails,Database Design,Activerecord,Normalization,我有一张配料表。当用户输入成分时,它会保存在表中。现在我注意到很多记录都在重复,我不想这样,我希望的是,如果这些记录已经存在,那么每个记录都被引用 例如,我在DB中节省了大约20倍的面粉。我希望它保存一次,对于每个配方,当用户输入面粉时,它应该只在数据库中引用该配料。我如何做到这一点 我已经有了一个入口模型(recipe)和一个join EntryingCredit模型。因此,每当一个条目保存一个已经存在的成分时,我希望它只引用EntryInCredit表中的成分(作为外键),而不是创建一个新的

我有一张配料表。当用户输入成分时,它会保存在表中。现在我注意到很多记录都在重复,我不想这样,我希望的是,如果这些记录已经存在,那么每个记录都被引用

例如,我在DB中节省了大约20倍的面粉。我希望它保存一次,对于每个配方,当用户输入面粉时,它应该只在数据库中引用该配料。我如何做到这一点

我已经有了一个入口模型(recipe)和一个join EntryingCredit模型。因此,每当一个条目保存一个已经存在的成分时,我希望它只引用EntryInCredit表中的成分(作为外键),而不是创建一个新的成分

class Ingredient < ActiveRecord::Base
  has_many :entry_ingredients
  has_many :entries, :through => :entry_ingredients

end

class EntryIngredient < ActiveRecord::Base
  belongs_to :entry
  belongs_to :ingredient

  accepts_nested_attributes_for :ingredient, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true

end

class Entry < ActiveRecord::Base
  belongs_to :user
  has_many :entry_ingredients
  has_many :ingredients, :through => :entry_ingredients
  has_many :steps

  accepts_nested_attributes_for :entry_ingredients, :allow_destroy => true
  accepts_nested_attributes_for :steps, :reject_if => lambda { |s| s[:description].blank? }, :allow_destroy => true

end

在没有看到一些代码的情况下很难准确地知道您需要什么,但是如果我理解正确的话,您只想创建一个还不存在的成分

看看rails。如果您使用的方法名称如下

@ingredient = Ingredient.find_or_create_by_name("flour")

如果之前没有名为“面粉”的条目或返回名为“面粉”的现有配料,它将创建一个新对象。在这两种情况下,@component将保存上述语句返回的所需条目。Rails只会在它还不存在的情况下为您创建它。

添加配料时,请查看自动完成解决方案。此外,还要为成分名称添加唯一性验证,以至少防止基于名称的重复。但是,如果添加唯一性验证,则用户在保存已存在的成分时会出错。。。也许我应该用一个而不是多个?我现在要发布我的模型。有了自动完成解决方案,你就不必担心唯一性验证失败。它就在那里,这样数据库中就不会有重复项。如果它已经存在于数据库中,那么应该使用自动完成功能。如果没有,那么可以添加一个自由形式的文本字段,这将创建一个新的成分。我还不想使用自动完成,宝石有魔力,我还在学习。我想弄清楚如何链接记录,有人能告诉我如何使用或没有动态查找程序来链接记录吗?那么我如何使用视图中的数据?用户将传入参数params[:name]?没错。只要把你需要的东西作为配料的名字传过来就行了。检查您的params散列以获得确切的密钥,但它将类似于
params[:name]
或者更确切地说是
params[:component][:name]
。很抱歉,我一直在尝试让它工作,但无法工作。我可能只是做错了,我在我的配料模型中加入了
@name=self.name
@component=self.find_或_create_by_name(@name)
,在我看来,我把表单字段改成了
f.text_字段:component_name
,我显然做错了什么,我现在要再尝试一下,如果你有任何建议,请告诉我。当我把params[:name]放在参数中时,我得到了一个错误未定义的局部变量或方法paramsCan我看了一下你的repo?是的,请让我知道:)我祝你成功!
@ingredient = Ingredient.find_or_create_by_name("flour")