Ruby on rails 验证是否存在has_one关系

Ruby on rails 验证是否存在has_one关系,ruby-on-rails,ruby,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3.2,我有两个相关的模型: class User < ActiveRecord::Base belongs_to :role, dependent: :destroy, polymorphic: true validates :role, presence: true end class Admin < ActiveRecord::Base has_one :user, as: :role attr_accessible :user_attributes acc

我有两个相关的模型:

class User < ActiveRecord::Base  
  belongs_to :role, dependent: :destroy, polymorphic: true

  validates :role, presence: true
end

class Admin < ActiveRecord::Base
  has_one :user, as: :role
  attr_accessible :user_attributes
  accepts_nested_attributes_for :user
end
用户_spec.rb

require "spec_helper"

describe User do
  let(:user) { FactoryGirl.build(:user) }
  let(:admin) { FactoryGirl.build(:admin_user) }

  describe "sign up" do
    it "should not be valid without associated role" do
      user.should_not be_valid
    end

    it "should be valid with associated role" do
      admin.should be_valid
    end
  end
end
管理规范

require "spec_helper"

describe Admin do
  let(:admin_base) { FactoryGirl.build(:admin) }
  let(:admin_user) { FactoryGirl.build(:admin_user).admin }

  describe "sign up" do
    it "should not be possible without associated user" do
      admin_base.should_not be_valid
    end
  end

  it "should have a first name" do
    admin_user.first_name = ""
    admin_user.should_not be_valid
  end

  it "should have a last name" do
    admin_user.last_name = ""
    admin_user.should_not be_valid
  end

  it "should create a correct full name" do
    admin_user.full_name.should == "Max Mustermann"
  end
end

目前只有第一个管理测试失败,但如果我验证管理模型中是否存在用户,几乎所有测试都会失败。可能是我的测试或工厂出错了?

我认为您仍然可以在admin上使用相同的验证。它应该也与关系有关

试一试


验证:用户,状态:true

您可以使用

class Admin

注意:
如果要确保关联存在并保证有效,还需要使用validates\u presence\u of。

我的工厂出错。它们应该看起来像:

FactoryGirl.define do
  sequence :email do |n|
    "foo#{n}@example.com"
  end

  factory :user_base, class: User do
    email
    password "secret12"
    password_confirmation "secret12"

    factory :user_with_role do
      association :role, factory: :admin
    end
  end

  factory :admin_base, class: Admin do
    first_name "Max"
    last_name "Mustermann"

    factory :admin do
      association :user, factory: :user_base, strategy: :build
    end
  end
end

现在,
上的测试验证:user,presence:true
按假设工作。

这会导致所有其他测试失败。我将我的测试发布到原始帖子。这会导致所有其他测试失败。从您下面的“已接受”答案来看,我想这是正确的答案吗?
class Admin < ActiveRecord::Base
  validates_associated :user
  validates_presence_of :user
end
FactoryGirl.define do
  sequence :email do |n|
    "foo#{n}@example.com"
  end

  factory :user_base, class: User do
    email
    password "secret12"
    password_confirmation "secret12"

    factory :user_with_role do
      association :role, factory: :admin
    end
  end

  factory :admin_base, class: Admin do
    first_name "Max"
    last_name "Mustermann"

    factory :admin do
      association :user, factory: :user_base, strategy: :build
    end
  end
end