2012-03-10 38 views
7

Tôi đang cố gắng giải quyết các mối quan hệ của mình nhưng tôi gặp sự cố khi sử dụng các liên kết.mô hình đường ray has_many: thông qua các hiệp hội

Vì vậy, tôi có ba mô hình Workout, ExerciseWorkoutExercise. Một tập luyện nên có nhiều bài tập và bài tập nên có tập luyện khác nhau do đó tôi đã viết:

class Workout < ActiveRecord::Base 
    has_many :workout_exercises 
    has_many :exercises, :through => :workout_exercises 
end 

class Exercise < ActiveRecord::Base 
    has_many :workout_exercises 
    has_many :workouts, :through => :workout_exercises 
end 

class WorkoutExercise < ActiveRecord::Base 
    belongs_to :exercise 
    belongs_to :workout 
end 

Tôi đang chạy một số xét nghiệm nhưng các xét nghiệm không đi qua một lần tôi có thể tạo một tập thể dục, tập thể dục và sau đó tham gia cùng họ trong workout_exercise lớp học. Nó sẽ không cho phép tôi truy cập vào các bài tập trong tập luyện như thế này:

Workout.create 
Exercise.create 
WorkoutExercise.create(:workout => Workout.first, :exercise => Exercise.first) 
work = Workout.first 
work.exercises.count #This line causes the error: undefined method exercises 

bảng cơ sở dữ liệu của tôi trông như thế này:

class CreateWorkouts < ActiveRecord::Migration 
    def change 
    create_table :workouts do |t| 
     t.string :title 
     t.text :description 
     t.float :score 
     t.timestamps 
    end 
    end 
end 

class CreateExercises < ActiveRecord::Migration 
    def change 
    create_table :exercises do |t| 
     t.string :title 
     t.text :description 
     t.float :value 
     t.timestamps 
    end 
    end 
end 

class CreateWorkoutExercises < ActiveRecord::Migration 
    def change 
    create_table :workout_exercises do |t| 
     t.timestamps 
    end 
    end 
end 

Khi tôi chạy thử nghiệm nó nói exercises là undefined. Có ai có ý tưởng nào?

+0

Bạn đã chạy di chuyển của mình chưa? Vui lòng cho chúng tôi biết 3 bảng của bạn. Và tôi nghĩ bạn nên bỏ qua đề nghị của Yanhao một lúc. Mã của bạn có vẻ chính xác, do đó bạn không phải thay đổi nó ngay bây giờ. Bạn đang thiếu cái gì khác. – Ashitaka

+0

@Ashitaka Tôi đã thêm các bảng ở trên, nó có liên quan gì đến bảng CreateWorkoutExercises không? Đây là lần đầu tiên tôi sử dụng habtm. – trev9065

+0

Ok, vậy là xong. Bạn đã bỏ lỡ các id đã thiết lập kết nối giữa hai bảng. Có thể bạn sẽ muốn tạo lại di chuyển của mình ngay bây giờ. Tôi nghĩ rằng 'rake db: reset' sẽ thực hiện công việc (nó sẽ xóa tất cả các bản ghi của bạn). – Ashitaka

Trả lời

10

Ok, vì vậy bảng WorkoutExercises của bạn không được để trống. Đây là cách hiển thị:

class CreateWorkoutExercises < ActiveRecord::Migration 
    def change 
    create_table :WorkoutExercises do |t| 
     t.integer :exercise_id, :null => false 
     t.integer :workout_id, :null => false 

     t.timestamps 
    end 

    # I only added theses indexes so theoretically your database queries are faster. 
    # If you don't plan on having many records, you can leave these 2 lines out. 
    add_index :WorkoutExercises, :exercise_id 
    add_index :WorkoutExercises, :workout_id 
    end 
end 

Ngoài ra, bạn có thể đặt tên bảng này là bất cứ điều gì bạn muốn, nó không phải là WorkoutExercises. Tuy nhiên, nếu bạn đang sử dụng mối quan hệ has_and_belongs_to_many, bảng của bạn sẽ phải đặt tên theo thứ tự là ExercisesWorkout. Chú ý cách bài tập đến trước khi tập luyện. Các tên phải được sắp xếp theo thứ tự bảng chữ cái. Đừng hỏi tôi tại sao, nó chỉ là một quy ước Rails.

Vì vậy, trong trường hợp này, bạn sẽ làm tốt với bảng của bạn được đặt tên là WorkoutExercises. Nhưng nếu tôi là bạn, tôi sẽ thay đổi nó thành Bài tậpWorkout, chỉ trong trường hợp, để bạn không bao giờ hiểu sai.

+1

Cảm ơn @Ashitaka. Trong Rails 4, việc di chuyển cột và chỉ mục có thể được viết trong một dòng 't.references: exercise, index: true' – scarver2

1

Mã của bạn có vẻ OK. Lỗi có thể là has_and_belongs_to_many là một lựa chọn tốt hơn. Xem Choosing Between has_many :through and has_and_belongs_to_many

+0

Tôi tin rằng các liên kết has_and_belongs_to_many không được chấp nhận. http://stackoverflow.com/questions/7850111/rails-3-1-has-and-belongs-to-many-deprecated – Ben

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