Używanie tabel join w ruby on rails

Powiedzmy, że mam dwie bazy danych: jedną dla uczniów i jedną dla klas. Chciałbym móc "dodawać" zajęcia do konkretnego ucznia, a także móc dodawać uczniów do konkretnej klasy. Zakładam, że muszę użyć tabeli łączenia tutaj, ale jestem trochę zagubiony w tym, jak z nich korzystać. W końcu chciałbym móc zrobić coś takiego:

  @class.students.find(@student_id)
A to mi powie, czy uczeń jest w klasie, czy nie. Wiem, że relacja między klasami a uczniami to 'has_many' i vice versa. Czy robienie 't. references :students' w plikach migrate to daje? Próbowałem dodać tę linię do mojego pliku migrate, a następnie próbowałem znaleźć coś za pomocą powyższej instrukcji i to dało mi błąd. Jestem nowy w RoR, więc nie jestem nawet pewien, jaki jest najlepszy sposób na osiągnięcie tego. Każda pomoc jest doceniana!
Author: Brian Tompsett - 汤莱恩, 2011-09-30

3 answers

Tak, jest to relacja wielu do wielu (klasa ma wielu uczniów, uczeń ma wiele klas). W tym celu użyjesz relacji has_many :through. Zapoznaj się z dokumentami dla ActiveRecord::Associations (Ctrl-F dla "Association Join Models").

W przypadku migracji, t.references :students określa się relację belongs_to, ponieważ dodaje ona kolumnę student_id (która może pomieścić tylko jeden identyfikator, tzn. jednego ucznia). Model join będzie jednak miał dwie kolumny: student_id i class_id. (Nawiasem mówiąc, wywołanie modelu 'Class' w Ruby jest prosząc o kłopoty. Mogę zasugerować "kurs"?)

 13
Author: Jordan Running,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-30 05:12:02

Wszystko prawda, co powiedział @ Jordan, oto konkretne kroki do podjęcia:

  1. Utwórz migrację : rails g model CourseStudent tworzy model łączenia dla relacji n: m i migracji do odpowiedniej tabeli.
  2. Edytuj plik migracji CreateCourseStudent tak, aby zawierał on:

    class CreateCourseStudent < ActiveRecord::Migration
      def change
        create_table :course_students do |t|
    
          # Your code comes here
          t.integer :student_id
          t.integer :course_id
    
          # Here comes the generated code 
          t.timestamps
        end
      end
    end
    
  3. Uruchom migrację: rake db:migrate. W rezultacie tabela join powinna teraz istnieć w Twojej bazie danych.

  4. Dodaj do modeli następujące kod

    class Course < ActiveRecord::Base
      has_many :course_students
      has_many :students, :through => :course_students
    end
    
    class Student < ActiveRecord::Base
      has_many :course_students
      has_many :courses, :through => :course_students
    end
    
    class CourseStudent < ActiveRecord::Base
      belongs_to :student
      belongs_to :course
    end
    

Możesz teraz korzystać z metod wygenerowanych przez metody belongs_to i has_many:

  • @course.students
  • @student.courses

Postaraj się znaleźć wszystkie istotne fakty i fragmenty w prowadnicach Rails , tam powinieneś znaleźć wszystkie informacje potrzebne do wejścia na tor. Powodzenia!

 58
Author: mliebelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-20 15:54:57

To stare pytanie, ale na wypadek, gdyby ktoś potknął się tak jak ja, możesz teraz mieć związki. Więc tak, można utworzyć tabelę join:

create_join_table :students, :courses do |t|
  t.integer :student_id
  t.integer :course_id
end
I wtedy w modelach, można powiedzieć, że uczeń has_and_belongs_to_many :courses I kurs has_and_belongs_to_many :students. Nie ma potrzeby tworzenia trzeciej klasy o nazwie CourseStudent. Ten link zawiera wszystkie te informacje
 13
Author: StephanieS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-08 23:14:25