Rails 多对多嵌套形式:如何防止重复?

2024-02-11

我在 Rails 3.2.3 应用程序中设置了一个嵌套表单,它工作正常,我的模型是:

class Recipe < ActiveRecord::Base
  attr_accessible :title, :description, :excerpt, :date, :ingredient_lines_attributes

  has_and_belongs_to_many :ingredient_lines
  accepts_nested_attributes_for :ingredient_lines
end

and:

class IngredientLine < ActiveRecord::Base
  attr_accessible :ingredient_id, :measurement_unit_id, :quantity

  has_and_belongs_to_many :recipes
  belongs_to :measurement_unit
  belongs_to :ingredient
end

如上所述,一个 Recipe 可以有多个 IngredientLine,反之亦然。

我试图避免 IngredienLine 表上的记录重复。

例如,假设对于 Recipe_1,与 {"measurement_unit_id" => 1, "ingredient_id" => 1, "quantity" => 3.5} 关联的 IngredientLine,如果对于 Recipe_5,IngredientLine 子表单由用户使用相同的值进行编译,我不想在 IngredientLine 表中添加新记录,而只希望在连接表成分_lines_recipes 中添加新关联记录。

请注意,目前我没有任何 IngredientLine 控制器,因为保存和更新 IngredientLine 是由嵌套表单例程处理的。甚至我的食谱控制器也是简单而标准的:

class RecipesController < ApplicationController
  respond_to :html

  def new
    @recipe = Recipe.new
  end

  def create
    @recipe = Recipe.new(params[:recipe])
    flash[:notice] = 'Recipe saved.' if @recipe.save  
    respond_with(@recipe)
  end

  def destroy
    @recipe = Recipe.find(params[:id])
    @recipe.destroy
    respond_with(:recipes)
  end

  def edit
    respond_with(@recipe = Recipe.find(params[:id]))
  end

  def update
    @recipe = Recipe.find(params[:id])
    flash[:notice] = 'Recipe updated.' if @recipe.update_attributes(params[:recipe])
    respond_with(@recipe)
  end

end

我的猜测是这应该足以覆盖标准createIngredientLine 的行为find_or_create,但我不知道如何实现它。

但是还有另一个需要注意的重要点,想象一下编辑存在一些 IngredientLine 的子表单,如果我添加另一个已经存储在 IngredientLine 表中的 IngredientLine,rails 当然不应该在 IngredientLine 表上写入任何内容,但也应该区分已经与父级关联的子记录和需要创建关系的新子记录,在连接表上写入新记录。

Thanks!


在Recipe模型中重新定义方法

def ingredient_lines_attributes=(attributes)
   self.ingredient_lines << IngredientLine.where(attributes).first_or_initialize
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 多对多嵌套形式:如何防止重复? 的相关文章

  • 如何从 Ruby 检查具有特定 pid 的进程是否正在运行?

    如果有多种方法 请列出 我只知道一个 但我想知道是否有一种更干净的 Ruby 方式 之间的区别Process getpgid and Process kill方法似乎是当 pid 存在但由另一个用户拥有时发生的情况 Process getp
  • 如何验证数值的小数位数?

    我在中间进行了验证 如下所示 validates numericality of shoe size message gt Please input a number 但这还不够 因为用户可以输入一些值 例如 42 222222221212
  • 在 Rails 4 中渲染部分/rake 任务/后台作业/模型中的视图

    我读过很多关于在 rake 任务 后台作业 模型中渲染 Rails 部分和视图的内容 我在 Stackoverflow 和网络上找到的绝大多数内容都描述了在 Rails 3 中工作的方法 但它们似乎已经过时了 而且我没有让它们工作 即使花了
  • BigDecimal 无法强制转换为 BigDecimal

    这应该很简单 但它却爆炸了 有任何想法吗 d BigDecimal new 2 0 YAML load a gt d to yaml TypeError BigDecimal can t be coerced into BigDecimal
  • 使用 Ruby 获取 AWS 区域名称

    我正在为 AWS 开发 Rails 应用程序 并希望为区域名称创建下拉菜单 例如 us east 1 等 如果有人已经创建了 gem 来获取它们 我想使用它 有人知道这样的 gem 或有用的 API 吗 适用于 Ruby 的 AWS 开发工
  • 在 Grails 域对象中维护自引用多对多关系的双方

    我在让多对多关系在 grails 中工作时遇到一些问题 以下内容是否有明显错误 class Person static hasMany friends Person static mappedBy friends friends Strin
  • Rails:渲染不起作用,仍然出现“模板丢失”

    我目前正在学习 Rails 指南 我完成了这些步骤 但仍然遇到错误 我的 Ruby 版本是ruby 2 1 1p76Rails 版本是4 0 4 按照指南的指示 我创建了一个Article Controller class Articles
  • (在 Ruby 中)允许混合类方法访问类常量

    我有一个为其定义常量的类 然后我定义了一个类方法来访问该类常量 这很好用 一个例子 usr bin env ruby class NonInstantiableClass Const hello world class lt lt self
  • 方法调用中是否有记忆约定?

    我想避免在方法调用中重新评估值 直到现在 我一直在这样做 def some method some method begin lot s of code end end 但它最终变得非常丑陋 在一些代码中 我看到类似以下内容 def som
  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • HABTM 关系和accepts_nested_attributes_for

    我有一个可以让我创建的表单新博客文章我希望能够创造新类别来自同一个表格 我在帖子和类别之间有一个习惯关系 这就是我遇到麻烦的原因 我有以下2个型号 class Post lt ActiveRecord Base has and belong
  • 带有附加参数的redirect_to

    我是一个菜鸟 redirect to users url notice Succeed p p 然后我添加一个message它失败了 redirect to users url notice Succeed message test p p
  • 如何编写一个在安装 RubyGem 时调用的钩子?

    我想编写一个 Ruby 片段 当我的 Gem 首次安装时运行 sudo gem install mygem 能做到吗 看起来并没有真正支持 我发现了一个 post install message 属性 您应该能够在 gem 规范中设置该属性
  • Ruby mp3 Id3 解析

    目前我正在从事一个音乐项目 处理用户 mp3 上传 问题是我找不到适用于所有文件的 id3 库 我努力了id3 ruby and Mp3Info库 但它们都没有给我一致正确的结果 例如 最常见的问题 错误的流参数 比特率和采样率 有时是持续
  • 使用复选框过滤列表

    我有一个电影列表及其评级 在我的页面顶部 我有一个表单 其中提供了一个复选框列表 其中显示了每个可用的评级 G PG 13 等 一旦用户单击复选框并点击提交 我只想显示所选的电影 在我的索引方法中 我有一个名为的实例变量 filtered
  • RSpec 请求规范发布一个空数组

    我目前正在 Rails 中开发 API 端点 如果我需要的数据无效 我想确保端点响应具有正确的错误状态 我需要一个 id 数组 无效值之一是空数组 Valid vendor district ids 2 4 5 6 Invalid vend
  • 下载所有 gems 依赖项

    我想通过下载任何所需的文件并将它们带到另一台计算机来安装指南针没有互联网连接 我已经下载了指南针的源包 当我在未连接的计算机上运行 gem 时 它抱怨缺少依赖项 有什么解决办法吗 这正是我遇到的问题 经过一段时间的搜索后 我找到了一个可以使
  • 在 Mac OS X 10.6.8 中手动编译 Ruby 时,GEM 在哪里?

    我在 Snow Leopard 上手动构建了 Ruby 1 9 2 现在我找不到我的旧 GEM 文件了 我猜他们现在正走在不同的道路上 所以我有三个问题 什么是 旧 宝石路径 在哪里gem install sinatra把西纳特拉宝石 当我
  • 检查rails devise ldap gem中的组成员身份,是否在yaml中?

    我是否应该使用 ldap yml 文件来确保使用 ldap 进行身份验证的人拥有分配给他们的正确组以允许他们进入 无论如何 我都不是 AD 专业人士 这让我很困惑 什么是组和属性 据我了解 我们在 AD 中有一个用户 他们有一个 samAc
  • 升级到 Rails 6 时是否有一种编程方法可以检测 Zeitwerk::NameError?

    我目前正在将旧的 Rails 应用程序迁移到 Rails 6 好像项目中有些文件和里面定义的类不一致 运行应用程序测试时我没有看到此错误 但部署后我收到如下错误 Zeitwerk NameError expected file app my

随机推荐