Ошибка проверки ассоциации вложенных атрибутов Rails - PullRequest
4 голосов
/ 20 января 2010

У меня есть вложенные атрибуты для модели Rails, и проверки связей по какой-то причине не выполняются. Я не использую acceptpts_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

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

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

Есть идеи, как заставить это работать?

Ответы [ 2 ]

5 голосов
/ 21 января 2010

validates_associated выглядит больше проблем, чем оно того стоит. Ваш пример работает, если вы отбросите validates_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
0 голосов
/ 21 января 2010

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

...