【问题标题】:validation error through FactoryGirl通过 FactoryGirl 的验证错误
【发布时间】:2014-07-05 04:08:28
【问题描述】:

我在通过 FactoryGirl 验证我的数据时遇到问题。

对于 team.rb,自定义验证是 has_only_one_leader 和 belongs_to_same_department

class Team < ActiveRecord::Base
    attr_accessible :name, :department, :active

    has_many :memberships
    has_many :users, through: :memberships

    accepts_nested_attributes_for :memberships, :users

    validates :department, inclusion: [nil, "Architectural", "Interior Design"]
    validates_uniqueness_of :name, scope: :department, conditions: -> { where(active: true) }
    validate :has_only_one_leader
    validate :belongs_to_same_department

    def has_only_one_leader
        unless self.users.where!(designation: "Team Leader").size == 1
            errors.add(:team, "needs to have exactly one leader")
        end
    end

    def belongs_to_same_department
        unless self.users.where!.not(department: self.department).size == 0
            errors.add(:users, "should belong to the same department")
    end
end

我还将包含membership.rb 和user.rb(仅限关联)仅供参考。

class Membership < ActiveRecord::Base
    belongs_to :team
    belongs_to :user
end

class User < ActiveRecord::Base
    has_many :memberships
    has_many :teams, through: :memberships
end

这是我的team.rb工厂

FactoryGirl.define do
    factory :team do
        sequence(:name) {|n| "Team #{n}" }
        department "Architectural"

        before(:create) do |team|
            team.users << FactoryGirl.create(:user, designation: "Team Leader",
                department: "Architectural")
            team.users << FactoryGirl.create_list(:user, 5, 
                designation: "CAD Operator", department: "Architectural")
        end
    end
end

似乎在我在 rails 控制台中执行FactoryGirl.create(:team) 之后,我似乎从我的验证中收到了错误消息。

当我手动建立团队时,我注意到了两件事,特别是向团队添加成员,其中有 1 名领导者和 5 名成员属于同一部门:

  1. team.users.where!(designation: "Team Leader").size 返回 6 尽管只有一名领导,将名称更改为 CAD 操作员也是如此,尽管团队中只有五名非领导,但返回 6

  2. 检查成员是否在同一个部门也是如此,team.users.where!.not(department: team.department).size 返回6,尽管他们都属于同一个部门。

在我的模型或工厂中是否需要进行任何修改?

【问题讨论】:

    标签: ruby-on-rails ruby validation factory-bot


    【解决方案1】:

    这是我在得到答案之前发现的一些事情。

    1. team.users.where(designation: "Team Leader") 返回一个 User::ActiveRelation_AssociationRelation 对象
    2. team.users 返回一个 User::ActiveRecord_Associations_CollectionProxy 对象
    3. CollectionProxy 没有方法 where 因为这个方法(在我看来)是对数据库的查询(如果团队已经保存在数据库中,你可以使用 where,但在这种情况下,它是仅用于建筑)

    因此,我使用select 方法和count 一起返回正确的值,就像这样。我将使用问题中的示例来说明答案。

    1. team.users.select(:designation) {|user| user.designation == "Team Leader"}.count 返回1
    2. team.users.select(:department) {|user| user.department != team.department}.count 返回0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多