Гем Rails Fabricator с отношением mongoid has_many_and_belongs_to

Я пытаюсь создать класс, который имеет вложенные элементы и имеет отношения HMABT с другим классом. вот мои классы

class Quote

  has_and_belongs_to_many :providers
  belongs_to :user 

class Provider

  has_and_belongs_to_many :quotes 
  belongs_to :user
  embeds_many :workdones


class Workdone
  embedded_in :provider  
  embeds_many :prices

class Price
  embedded_in :workdone

Это мои производители

Fabricator(:price) do 
  workdone
  variation_id {Fabricate(:variation)._id}
  price {12}
  discount {5} 
end 

usern = Faker::Name.last_name
uidn = Faker::Number.number(10) 
Fabricator(:user) do
    uid 123456
    username {usern }
    email {Faker::Internet.email}
    username_or_uid { [ usern , uidn] }
    provider {'facebook'}
    name {Faker::Name.name }
    gender {'male'}
    birthday { Time.at(rand * (18.years.ago.to_f - 50.years.ago.to_f) + 50.years.ago.to_f).to_date } 
end

Fabricator(:workdone) do 
    provider 
    workdonecount {1}
    quotegivencount {1}
    rating {5}
    active {true}
    give_price {true}
end


Fabricator(:provider) do
  user 
  business_address {"Bostanlı Mh., 6352. Sokak No:15, 35480 İzmir, Türkiye"}
  business_description {"Biz de sadece epilasyon işleriyle uğraşıyoruz ve bu işlerin  
  quote(count: 1)

 Fabricator(:quote) do 
    user  
    providers(count: 3) { Fabricate(:price).workdone.provider } 
    share_on_facebook_timeline {false} 
    customer_address {"Bostanlı Mh., 6352. Sokak No:15, 35480 İzmir, Türkiye"}
    description {"dasdsadasdsad sadadsssssdsadsasdas"}
    location {[27.094637499999976,38.4621336 ] }
    variation_id { Fabricate(:variation)._id}
end

Когда я создаю цитату с помощью Fabricate(:quote)

Выдает это сообщение об ошибке

   Quote#give_quote works
     Failure/Error: Unable to find matching line from backtrace
     SystemStackError:
       stack level too deep

Когда я удаляю цитату (количество: 1) из производителя провайдера, он выдает эту ошибку. Кстати, это работает на консоли rails - создаются провайдеры.

Failure/Error: quote = Fabricate(:quote)
     TypeError:
       no implicit conversion of nil into String
     # ./spec/fabricators/quote_fabricator.rb:4:in `block (2 levels) in <top (required)>'
     # ./spec/models/quote_spec.rb:51:in `block (3 levels) in <top (required)>'

Когда я полностью удаляю ассоциацию поставщиков (количество: 3) { Fabricate (: price).workdone.provider } из теста производителя котировок, тесты проходят, но, конечно, поставщики не создаются.

Кто-нибудь знает, как я могу создавать провайдеров?


person Caner Çakmak    schedule 06.06.2014    source источник


Ответы (1)


Можно ли по этой квоте вытащить из сгенерированного пользователя трех провайдеров? Вы можете сделать это с помощью приведенного ниже определения Fabricator.

Fabricator(:quote) do user providers { |attrs| attrs[:user].providers.sample(3) } share_on_facebook_timeline false customer_address "Bostanlı Mh., 6352. Sokak No:15, 35480 İzmir, Türkiye" description "dasdsadasdsad sadadsssssdsadsasdas" location [27.094637499999976,38.4621336] variation_id { Fabricate(:variation)._id } end

Кроме того, вам нужно использовать синтаксис блока только в том случае, если вы динамически генерируете значения. В случае со всеми вашими статическими значениями, просто передавая их напрямую (как в приведенном выше примере), вы получите немного меньше накладных расходов.

person Paul Elliott    schedule 08.06.2014
comment
Я действительно решил проблему. Проблема заключалась в пустом значении пространственной точки, используемом гемом gmaps4rails, которое я с трудом мог обнаружить. Кстати, обновил мой код вашим ответом, спасибо за помощь и ваш большой вклад в создание драгоценного камня. - person Caner Çakmak; 08.06.2014