简体   繁体   中英

HABTM Association with FactoryGirl

Have looked through and tried most examples and still cannot create a working HABTM . No matter how the CaseTrack and CaseTrackValue factories are constructed, I'm not able to find the CaseTrackValue[] in CaseTrack. Shouldn't creating CaseTrack properly provide a CaseTrackValue param within CaseTrack.
BTW: the only working association for HABTM seems to be putting

case_track_values { |a| [a.association(:case_track_value)] } case_track_values { |a| [a.association(:case_track_value)] } in CaseTrack.

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

Take a look at HABTM factories working in one of my projects. I put here the whole setup within a common example for you could understand it deeper and other stackoverflowers could easily adapt that example for their use cases.

So we have books and categories. There could be book belonging to many categories and there could be category with many books in it.

models/book.rb

class Book < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

models/category.rb

class Category < ActiveRecord::Base
  has_and_belongs_to_many :books
end

factories/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

factories/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

My helper method which you have to put somewhere in spec/support and then include it where you need it:

 # 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM