ruby-on-rails 如何在Rails中验证与嵌套属性的关联?

dgenwo3n  于 7个月前  发布在  Ruby
关注(0)|答案(1)|浏览(107)

我有一个包含许多ListItem的List。

class List < ApplicationRecord
  has_many :list_items
  accepts_nested_attributes_for :list_items

class ListItem < ApplicationRecord
  belongs_to :list

字符串
当我在ListItem上运行验证时,列表不会持久化在DB中。
list_id为nil。
如何验证(例如)列表是否有效,并将从ListItem验证中创建?
Rails 7.0.7
ListItem创建时已检查。

uwopmtnx

uwopmtnx1#

在Rails中处理嵌套属性和关联时,可以遵循一些步骤来确保在验证和保存任何子记录(ListItem)之前持久化父记录(在本例中为List)。
以下是您如何实现这一点:
1.在ListItem模型中,添加验证以确保关联的List对象有效:

class ListItem < ApplicationRecord
  belongs_to :list
  validate :list_must_be_valid

  private

  def list_must_be_valid
    errors.add(:list, 'must be valid') unless list&.valid?
  end
end

字符串
1.在List模型中,你可以在has_many关联中使用inverse_of选项。这告诉Rails这两个关联描述了相同的关系,但是从相反的Angular 。这有助于Rails在验证嵌套的ListItem对象时识别内存中的List对象:

class List < ApplicationRecord
  has_many :list_items, inverse_of: :list
  accepts_nested_attributes_for :list_items
end


1.当你创建一个新的List及其嵌套的ListItem对象时,确保你是在List对象的基础上构建ListItem对象的。这样,list_id将为每个ListItem正确设置:

@list = List.new(list_params)
@list.list_items.build(item_params)


或者,如果您使用accepts_nested_attributes_for

params = {
  list: {
    name: 'My List',
    list_items_attributes: [
      { content: 'Item 1' },
      { content: 'Item 2' }
    ]
  }
}

@list = List.new(params[:list])


通过执行这些步骤,您将确保在验证ListItem时,它也将验证其关联的List。如果List或其任何ListItem对象无效,则不会将它们保存到数据库中。

相关问题