2017-01-22 16 views
1

Просмотрели и попробовали большинство примеров и до сих пор не могут создать рабочий HABTM. Независимо от того, как построены фабрики CaseTrack и CaseTrackValue, я не могу найти CaseTrackValue[] в CaseTrack. Не следует создавать корректный параметр CaseTrackValue в CaseTrack.
BTW: единственное рабочее объединение для HABTM, похоже, ставитАссоциация HABTM с FactoryGirl

case_track_values { |a| [a.association(:case_track_value)] }10 Case Case.

class CaseTrack 
has_and_belongs_to_many CaseTrackValue 
end 

class CaseTrackValue 
has_and_belongs_to_many CaseTrack 
end 

Rspec 
it 'may exercise the create action' do 
    post '<route>', params: {case_track: attributes_for(:case_track)} 
end 
end 

class CaseTrackController < ApplicationController 
private: 
    def case_track_params 
    params.require(:case_track).permit(:name, :active, {case_track_values:[]}) 
    end 
end 

ответ

0

Посмотрите на заводы HABTM, работающие в одном из моих проектов. Я поставил здесь всю настройку в общий пример, чтобы вы могли понять ее глубже, а другие stackoverflowers могли легко адаптировать этот пример для их использования.

У нас есть книги и категории. Там может быть книга, принадлежащая ко многим категориям, и в ней может быть категория с множеством книг.

модели/book.rb

class Book < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

модели/category.rb

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :books 
end 

заводы/books.rb

FactoryGirl.define do 
    factory :book do 

    # factory to create one book with 1-3 categories book belongs to 
    factory :book_with_categories do 
     transient do 
     ary { array_of(Book) } 
     end 
     after(:create) do |book, ev| 
     create_list(:category, rand(1..3), books: ev.ary.push(book).uniq) 
     end 
    end 

    #factory to create a book and one category book belongs to 
    factory :book_of_category do 
     after(:create) do |book, ev| 
     create(:category, books: [book]) 
     end 
    end 
    end 
end 

заводы/categories.rb

FactoryGirl.define do 
    factory :category do 

    #factory to create category with 3-10 books belong to it 
    factory :category_with_books do 
     transient do 
     ary { array_of(Category) } 
     num { rand(3..10) } 
     end 
     after(:create) do |cat, ev| 
     create_list(:book, ev.num, 
      categories: ev.ary.push(cat).uniq) 
     end 
    end 
    end 
end 

Мой метод помощник который вы должны поставить где-нибудь в spec/support, а затем включить его там, где вам это нужно:

# method returns 0-3 random objects of some Class (obj) 
    # for example 0-3 categories for you could add them as association 
    # to certain book 
    def array_of(obj) 
    ary = [] 
    if obj.count > 0 
     Random.rand(0..3).times do 
     item = obj.all.sample 
     ary.push(item) unless ary.include?(item) 
     end 
    end 
    ary 
    end 

 Смежные вопросы

  • Нет связанных вопросов^_^