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! 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"?)
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:
- Utwórz migrację :
rails g model CourseStudent
tworzy model łączenia dla relacji n: m i migracji do odpowiedniej tabeli. -
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
Uruchom migrację:
rake db:migrate
. W rezultacie tabela join powinna teraz istnieć w Twojej bazie danych.-
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!
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 informacjeWarning: 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