#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. не могли бы вы, пожалуйста, объяснить немного подробнее свой пример или, может быть, вы можете дать мне более подробную информацию ?