2015-01-20 15 views
16

Có cách nào để tải các đồ đạc Rails theo một thứ tự cụ thể trong khi chạy thử nghiệm không? Ví dụ, học các lớp sau đây ...Tải các đồ đạc đường ray theo một thứ tự cụ thể khi kiểm tra

class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, through: :memberships 
end 

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, through: :memberships 
end 

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

Memberships có một mức cơ sở dữ liệu ràng buộc khoá ngoại đòi hỏi UsersGroups có mặt trước khi chúng có thể được tạo ra. Tuy nhiên, vì Rails tải lịch thi đấu theo thứ tự abc, Memberships được tải trước Users và một lỗi xảy ra cho biết mối quan hệ không tồn tại (đúng như vậy).

ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: insert or update on table "memberships" violates foreign key constraint 

Có cách nào để nạp UsersGroups đồ đạc trước khi tải Memberships trong khi chạy thử nghiệm?

+0

Bạn đang sử dụng đồ đạc có tên? Xem tại đây: http://stackoverflow.com/questions/510195/rails-fixtures-how-do-you-set-foreign-keys – davidfurber

+0

Có, tôi đang sử dụng đồ đạc có tên. –

+0

Bạn đã thử cài đặt FIXTURES env var chưa? Và/hoặc sử dụng "đồ đạc" lệnh trong thử nghiệm để xác định những đồ đạc để tải? – davidfurber

Trả lời

36

Sự cố của bạn không phải là thứ tự Rails đang chạy thử nghiệm của bạn. Tôi đã có vấn đề tương tự như bạn, và sau khi gỡ lỗi cho một vài giờ nhận ra rằng ActiveRecord thực sự KHÔNG tắt tính toàn vẹn tham chiếu trong quá trình chèn hồ sơ trận đấu để ngăn chặn các loại lỗi cho Postgresql.

Bắt là người dùng cơ sở dữ liệu thử nghiệm của bạn phải có đặc quyền superuser trên db kiểm tra cho ActiveRecord để vô hiệu hóa thành công tính toàn vẹn tham chiếu khi cần thiết cho đồ đạc.

Đây là cách bạn khắc phục sự cố:

  1. Đăng nhập vào PostgreSQL với superuser mặc định của bạn (tôi là "postgres")
  2. Thực hiện các lệnh sau:

    ALTER ROLE yourtestdbuser WITH SUPERUSER; 
    
  3. Thưởng thức của bạn đồ đạc làm việc đúng cách.

Phiên bản tiếp theo của Rails sẽ có cảnh báo (khi tôi đang chạy cơ sở dữ liệu thử nghiệm với Postgresql và người dùng không có vai trò siêu người dùng). Tôi tìm thấy điều này trên a Rails GitHub issue suggesting the warning.

+1

Hoạt động hoàn hảo. Cảm ơn! –

+0

Tôi đang gặp sự cố này trong một phiên bản RDS postgres. Có gì đặc biệt mà RDS sẽ ném vào hỗn hợp? Vai trò 'superuser' của RDS có giống với siêu người dùng thông thường không? – sixty4bit

+0

Tôi cũng nên thêm rằng Rails của tôi có vẻ KHÔNG tải đồ đạc theo thứ tự bảng chữ cái, vì nó đang tải VanguardFunds (dựa trên BenchmarkFunds) trước khi BenchmarkFunds – sixty4bit

9

Cấp đặc quyền superuser PostgreSQL cho tài khoản "thử nghiệm" của bạn cho phép Rails hoạt động theo cách mà nó muốn hoạt động. Trong trường hợp này không phải là mong muốn/khả thi ...

Vâng, nó có thể - nếu không được hỗ trợ - để kiểm soát trật tự đồ đạc trong đó được nạp và xóa (cả hai đều là quan trọng) .

Trong test/test_helper.rb:

class ActiveRecord::FixtureSet 
    class << self 
    alias :orig_create_fixtures :create_fixtures 
    end 
    def self.create_fixtures f_dir, fs_names, *args 
    # Delete all fixtures that have foreign keys, in an order that 
    # doesn't break referential integrity. 
    Membership.delete_all 

    reset_cache 

    # If we're adding any {user, group} fixtures, add them [a] in that 
    # order, [b] before adding any other fixtures which might have 
    # references to them. 
    fs_names = %w(users groups) & fs_names | fs_names 

    orig_create_fixtures f_dir, fs_names, *args 
    end 
end 

Thử nghiệm với Rails 4.2.3, và chỉ khi sử dụng fixtures :all.

+0

Điều này khắc phục được sự cố cho tôi (Tôi không thể thực hiện thay đổi đối với người dùng db trong RDS đối với một số lý do). Cảm ơn bạn rất nhiều! – sixty4bit

+0

đã cứu người đàn ông sống của tôi! Thử nghiệm với kết nối JDBC và Informix. Cảm ơn bạn! –

Các vấn đề liên quan