ошибка проверки через FactoryGirl

#ruby-on-rails #ruby #validation #factory-bot

#ruby-on-rails #ruby #проверка #factory-бот

Вопрос:

У меня проблемы с проверкой моих данных через 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
  

Кажется, что после того, как я делаю FactoryGirl.create(:team) в консоли rails, кажется, что я получил сообщения об ошибках от моих проверок.

Две вещи, которые я заметил, когда вручную создавал команду, в частности, добавляя участников в команду с 1 руководителем и 5 участниками, принадлежащими к одному отделу:

  1. team.users.where!(designation: "Team Leader").size возвращает, 6 хотя есть только один лидер, то же самое касается изменения обозначения на оператор САПР, возвращает, 6 хотя в команде всего пять не лидеров.

  2. то же самое касается проверки, находятся ли участники в одном отделе, team.users.where!.not(department: team.department).size возвращает 6 , хотя все они принадлежат к одному отделу.

Нужно ли внести какие-либо изменения в мою модель или на мой завод?

Ответ №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