2012-05-14 33 views
16

tôi có các mô hình sau:Làm cách nào để thiết lập đồ đạc cho mối quan hệ 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 

Bất cứ khi nào tôi nhận được một yêu cầu mới, tôi muốn gửi một thông báo cho các công ty hoạt động trong khu vực tương tự.

Làm cách nào để thiết lập điều này trong đồ đạc của mình để tôi có thể kiểm tra logic của việc tìm kiếm đúng công ty?

Tôi đã thử

region_ids: 1, 2 
regions: one, two 

trong companies.yml, nhưng không phải tác phẩm trong phân vùng cho các công ty.

Dưới đây là một ý chính của SQL tạo: https://gist.github.com/2713518

Trả lời

28

Đối

regions: one, two 

trong companies.yml để làm việc bạn cần để cho đường ray tự động gán id cho các vùng. Điều này là do (để tránh phải đọc các vùng.yml trước các công ty.yml) đường ray tính toán các id mà nó dính vào bảng kết nối từ tên của các đồ đạc công ty. nếu bạn đã chỉ định id cho mình, chúng sẽ không khớp với id được tính toán.

Từ sql bạn đã cung cấp có vẻ như bạn đang thiết id trên vùng 1 và 2, ví dụ: regions.yml của bạn có

one: 
    id: 1 
    name: MyString 

Tháo id:1 và bạn nên ok. Bạn cũng sẽ cần phải cập nhật bất kỳ tập tin khác (ví dụ request_for_proposals.yml) tham chiếu đến các vùng, thay thế

region_id: 1 

với

region: one 

Rails sẽ biết đó có nghĩa là để thiết lập region_id đến id cho khu vực có nhãn one trong đồ đạc của bạn.

0

tôi không chắc chắn làm thế nào một sử dụng đồ đạc YAML những ngày này. Bạn đã thử FactoryGirl để tạo các cá thể đối tượng db trong khi thử nghiệm chưa? Nó thực hiện khá nhiều giống như đồ đạc, trong một cách tinh vi nhiều mặc dù.

Các đoạn sau giả định bạn đang sử dụng rspec làm khung kiểm tra.

Sau bao gồm factory_girl-rails trong Gemfile của bạn và cập nhật spec/spec_helper.rb phù hợp với factory_girl s README, tạo các tập tin sau đây:

# 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 

Bây giờ câu hỏi thực sự là - mã kiểm tra thực tế bạn đang làm là gì?

0

Vùng của bạn có nằm trong thư mục thử nghiệm/đồ đạc không? Làm thế nào về companies.yml? Mã của bạn "vùng: một, hai", cho một công ty cụ thể, nên hoạt động.
Rails tự động tải các đồ đạc trong thư mục này khi bạn chạy thử nghiệm. Nếu vị trí chính xác, vui lòng đăng kết quả thử nghiệm - tạo sql - khi bạn chạy thử nghiệm.

+0

Dưới đây là một ý chính của SQL tạo: https: //gist.github .com/2713518 –

+0

Và có, các tập tin đồ đạc nằm trong thư mục test/fixtures –

-1

Ngoài câu trả lời được chấp nhận nếu bạn cần tự mình tính toán id đó, ví dụ: bạn có một số tài liệu tham khảo lỏng hoặc nguồn dữ liệu khác chỉ cần thêm:

def fixh(key) 
    ActiveRecord::FixtureSet.identify key 
end 

để test_helper.rb của bạn và sau đó sử dụng cách này trong đồ đạc:

security_context1: 
    ext_id: <%= fixh :user1 %> 
Các vấn đề liên quan