Как настроить мои приборы для отношения has_and_belongs_to_many?
У меня есть следующие модели:
class Company < ActiveRecord::Base
has_and_belongs_to_many :regions
class Region < ActiveRecord::Base
has_many :requests
has_and_belongs_to_many :companies
class RequestForProposals < ActiveRecord::Base
belongs_to :region
Всякий раз, когда я получаю новый запрос, я хочу отправить уведомление компаниям, действующим в том же регионе.
Как мне настроить это в моих светильниках, чтобы я мог unit test логику поиска правильных компаний?
Я пробовал
region_ids: 1, 2
regions: one, two
в компаниях .yml, но не работает при присвоении регионов компаниям.
Вот суть генерируемого SQL: https://gist.github.com/2713518
Ответы
Ответ 1
Для
regions: one, two
в companies.yml
для работы вам нужно, чтобы рельсы автоматически назначали идентификаторы для регионов. Это связано с тем, что (во избежание необходимости чтения областей .yml перед компаниями .yml) rails вычисляет идентификаторы, которые он вставляет в таблицу соединений из названий компаний. если вы сами назначили идентификаторы, они не будут совпадать с вычисленными.
Из sql, который вы указали, похоже, что вы устанавливаете идентификаторы в регионах на 1 и 2, то есть ваши регионы .yml имеют
one:
id: 1
name: MyString
Удалите id:1
, и все будет в порядке. Вам также потребуется обновить любые другие файлы (например, request_for_proposals.yml), которые относятся к регионам, заменяя
region_id: 1
с
region: one
Rails будет знать, что это означает установить region_id
идентификатор для области с меткой one
в ваших светильниках.
Ответ 2
Я не уверен, как использовать YAML-светильники в наши дни. Вы пробовали FactoryGirl для создания экземпляров объекта db во время тестирования? Тем не менее, он делает почти то же самое, что и приспособления, но сложнее.
В следующих отрывках предполагается, что вы используете rspec
в качестве рамки тестирования.
После включения factory_girl-rails
в Gemfile
и обновления spec/spec_helper.rb
в соответствии с factory_girl
README создайте следующие файлы:
# spec/factories/company_factories.rb
FactoryGirl.define do
factory :company do
title { |n| "Test Company #{n}" }
# whatever else fields
after_create { |company| company.regions << FactoryGirl.create(:region) }
end
end
# spec/factories/region_factories.rb
FactoryGirl.define do
factory :region do
# whatever fields here
end
end
# spec/factories/request_factories.rb
FactoryGirl.define do
factory :request do
# whatever fields here
end
end
Теперь реальный вопрос: какой фактический тестовый код вы делаете?
Ответ 3
Является ли ваш region.yml в каталоге test/fixtures? Как насчет компаний .yml? Ваш код "регионы: один, два", для данной компании, должен работать.
Rails автоматически загружает приборы в этом каталоге при запуске теста.
Если местоположения верны, отправьте тестовый результат - sql generated - при запуске тестов.
Ответ 4
В дополнение к принятому ответу, если вам нужно рассчитать такой идентификатор самостоятельно, например. у вас есть некоторые свободные ссылки или другой источник данных, просто добавьте:
def fixh(key)
ActiveRecord::FixtureSet.identify key
end
на ваш test_helper.rb
, а затем используйте этот способ в светильниках:
security_context1:
ext_id: <%= fixh :user1 %>