#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 участниками, принадлежащими к одному отделу:
-
team.users.where!(designation: "Team Leader").size
возвращает,6
хотя есть только один лидер, то же самое касается изменения обозначения на оператор САПР, возвращает,6
хотя в команде всего пять не лидеров. -
то же самое касается проверки, находятся ли участники в одном отделе,
team.users.where!.not(department: team.department).size
возвращает6
, хотя все они принадлежат к одному отделу.
Нужно ли внести какие-либо изменения в мою модель или на мой завод?
Ответ №1:
Вот что я обнаружил, прежде чем получить ответ.
team.users.where(designation: "Team Leader")
возвращаетUser::ActiveRelation_AssociationRelation
объектteam.users
возвращаетUser::ActiveRecord_Associations_CollectionProxy
объектCollectionProxy
не имеет метода,where
поскольку этот метод (на мой взгляд) представляет собой запрос к базе данных (за исключением случаев, когда команда уже сохранена в базе данных, вы можете использоватьwhere
, но в данном случае это только для сборки)
Поэтому я использовал select
метод, сопровождаемый count
, чтобы вернуть правильные значения следующим образом. Я использую свой пример из вопроса, чтобы проиллюстрировать ответ.
team.users.select(:designation) {|user| user.designation == "Team Leader"}.count
ВОЗВРАТ1
team.users.select(:department) {|user| user.department != team.department}.count
ВОЗВРАТ0