Вложенные атрибуты API Rails Find_or_create, чтобы избежать дублирования, не работают

#ruby-on-rails #ruby #api #nested #associations

Вопрос:

Я пытаюсь контролировать вложенные атрибуты в случае дублирования, найдите строку и используйте ее вместо создания новой, она отлично работает на более низком вложенном уровне, который является питанием.

однако, если я использую его, прокомментированный код в 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
 

День.рб

 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
 

Еда.рб

 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 замените массив дней 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 
 

Комментарии:

1. не могли бы вы, пожалуйста, объяснить немного подробнее свой пример или, может быть, вы можете дать мне более подробную информацию ?