Направляющие вложенный сбой проверки ассоциации атрибутов

Я вложил атрибуты для модели Rails, и проверки ассоциаций перестали работать по некоторым причинам. Я не useing accepts_nested_attributes_for, но я делаю что-то очень похожее.

class Project < ActiveRecord::Base
  has_many :project_attributes

  def name
    project_attributes.find_by_name("name")
  end

  def name=(val)
    attribute = project_attributes.find_by_name("name")

    if attribute
      attribute.value = val
    else
      project_attributes.build(:name=>"name", :value=>val)
    end
  end
end

class ProjectAttribute < ActiveRecord::Base
  belongs_to :project

  validates_presence_of :name
  validates_uniqueness_of :name, :scope => :project_id

  validates_presence_of :project_id, :unless => lambda {|attribute| attribute.project.try(:valid?)}
  validates_associated :project

end

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

Я также посмотрел на accepts_nested_attributes_for дочерний сбой проверки ассоциации, который дал мне validates_presence_of :unless=>valid?

Какие-либо идеи о том, как заставить это работать?

5
задан Community 23 May 2017 в 11:46
поделиться

2 ответа

Validates_sascied выглядит больше проблем, чем стоит. Ваш пример работает, если вы бросаете Validate_Presence_of: Project_id. Вот халкий пример, который восстанавливает, что проверки (нашли описание здесь ).

class ProjectAttribute < ActiveRecord::Base
  belongs_to :project

  validates_presence_of :name
  validates_uniqueness_of :name, :scope => :project_id

  validates_presence_of :project_id, :unless => Proc.new { |project_attribute|
    project = project_attribute.project
    ObjectSpace.each_object(Project) {|o| project = o if o.project_attributes.include?(project_attribute)} unless project
    project
  }
end
5
ответ дан 15 December 2019 в 06:27
поделиться

Просто добавьте ненулевое ограничение на Project_ID и позвольте ему взорваться, если произойдут фанк. Ох, и убедитесь, что ваше испытательное покрытие тоже хорошо.

-2
ответ дан 15 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: