【问题标题】:Rails polymorphic association with connection tableRails 与连接表的多态关联
【发布时间】:2012-08-26 15:37:01
【问题描述】:

我有一张叫做食谱的桌子和一张叫做配料的桌子。成分可以连接到食物或食谱(一个食谱可以包含其他食谱)。我已经用它的食物部分实现了它,但我不确定如何实现它的食谱部分。我创建了另一个表,称为它的食物部分,称为 recipe_as_ingredients,当使用当前食谱中选择作为成分的食谱保存食谱时,我将需要填充该表。如果为食谱删除了行,我可能必须在每次保存之前更新表并手动删除行。有没有更好的实现方式?

以下是模型:

class Recipe < ActiveRecord::Base
  has_many :ingredients
end

class Ingredient < ActiveRecord::Base
  belongs_to :element, :polymorphic => true
  belongs_to :recipe
end

class Food < ActiveRecord::Base
  has_many :ingredients, :as => :element
end

class RecipeAsIngredient < ActiveRecord::Base
  has_many :ingredients, :as => :element
end

我在保存之前在函数中手动设置了元素类型,因此我需要将配方与成分类似,但请确保 recipe_as_ingredient 包含连接到成分的记录:

self.element_id = numid.id
self.element_type = 'Food'

附言如果没有 recipe_as_ingredients 连接表,我无法连接配方,因为它无法保存记录,因为配方既是主记录又是详细记录,并且 id 字段始终为 nil。

【问题讨论】:

    标签: ruby-on-rails polymorphic-associations


    【解决方案1】:

    你很亲密。

    移动: has_many :ingredients, :as => :element

    进入配方模型。

    RecipeAsIngrident 应该存在。如果你想获取食谱中使用的所有食物,那么你需要一个食谱上的函数来总结后代。这将是一个计算的总数,因此您不需要回调来更新总数等,但是我会添加逻辑以防止删除用于其他用途的配方。

    询问您是否需要更多说明。

    【讨论】:

    • 你好。当我将此行移动到配方模型时,所有成分行都会在我保存配方时损坏,因此它不起作用。
    • 如果您有现有数据,那么您可能需要对其进行更改以符合新规范。如果你已经在数据库中有“食谱 a”和“食物 a”,请尝试在控制台中运行它:r = Recipe.new;r.ingredients.build([{element: Recipe.first, quantity: 1}, {element: Food.first, quantity: 1}]); r.save!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多