Rails API 嵌套属性 Find_or_create 以避免重复不起作用

Posted

技术标签:

【中文标题】Rails API 嵌套属性 Find_or_create 以避免重复不起作用【英文标题】:Rails API nested attirbutes Find_or_create to avoid duplications doesn't work 【发布时间】:2021-10-05 04:00:24 【问题描述】:

我正在尝试控制嵌套属性以防出现重复,请务必找到该行并使用它而不是创建一个新行,它可以在较低的嵌套级别(即餐点)上正常工作。

但是,如果我使用它,plan.rb 中的注释代码(您可以在下面查看)会使餐点空白,就好像我没有在我的请求中传递任何餐点,对此有什么想法吗?

Plan.rb

class Plan < ApplicationRecord
  has_and_belongs_to_many :meals
  has_and_belongs_to_many :days
  has_one_attached :image, dependent: :destroy
  validate :acceptable_image
  accepts_nested_attributes_for :days, reject_if: ->(object)  object[:number].blank? 

  #! this is causing meals to not save
  # # before_validation :find_days
  # def find_days
  #   self.days = self.days.map do |object|
  #     Day.where(number: object.number).first_or_initialize
  #   end
  # end
  #!
end

Day.rb

class Day < ApplicationRecord
  has_and_belongs_to_many :meals
  has_and_belongs_to_many :plans
  accepts_nested_attributes_for :meals, reject_if: ->(object)  object[:name].blank? 
  before_validation :find_meals

  def find_meals
    self.meals = self.meals.map do |object|
      Meal.where(name: object.name).first_or_initialize
    end
  end
end

Meal.rb

class Meal < ApplicationRecord
  has_and_belongs_to_many :plans
  has_and_belongs_to_many :days
end

这就是我允许我的参数的方式

def plan_params
    params.require(:plan).permit(:name, :monthly_price, :image_url, days_attributes: [:number, meals_attributes: [:name, :calories, :protein, :fat, :carbohydrates, :categorie]])
end

很抱歉拖这么久,但我想提供尽可能多的细节。

【问题讨论】:

【参考方案1】:

由于您正在映射 self.days 关联,Day.where(number: object.number).first_or_initialize 将 days 数组替换为 Day 对象,而没有任何 meal 属性。

您需要在 map 块内执行类似的操作:

day = Day.where(number: object.number).first_or_initialize
day.attributes = object.attributes
# or similar, to copy the nested attributes provided by the request 

day 

【讨论】:

你能解释一下你的例子吗,或者你能给我更多的细节吗?

以上是关于Rails API 嵌套属性 Find_or_create 以避免重复不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 创建具有嵌套属性的记录

Rails 嵌套模型和虚拟属性初始化

嵌套属性中的 Rails/Mongoid 错误消息

我的 rails 嵌套模型无法识别 _destroy 属性

使用质量分配在rails 4中添加带有复选框的嵌套属性

如何仅更新 rails 6 中 current_user 的嵌套表单属性?