Как настроить мои приборы для отношения has_and_belongs_to_many? - программирование

Как настроить мои приборы для отношения 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

4b9b3361

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