Skip to content

Latest commit

 

History

History
60 lines (43 loc) · 2.83 KB

define-associations.org

File metadata and controls

60 lines (43 loc) · 2.83 KB

1. Define the relationship in the initializer file

Associations can be defined in the initializer file, and when Arql starts, it first generates the model class based on the database schema and then loads the initializer file.

The initializer file is a Ruby file, so you can define associations within it, for example:

module Blog
  class Student
    has_many :courses, foreign_key: :student_id, class_name: 'Course'
    belongs_to :school, foreign_key: :school_id, class_name: 'School'

    has_and_belongs_to_many :teachers, join_table: 'students_teachers', foreign_key: :student_id, association_foreign_key: :teacher_id, class_name: 'Teacher'
  end

  class Course
    belongs_to :student, foreign_key: :student_id, class_name: 'Student'
  end

  class School
    has_many :students, foreign_key: :school_id, class_name: 'Student'
  end

  class Teacher
    has_and_belongs_to_many :students, join_table: 'students_teachers', foreign_key: :teacher_id, association_foreign_key: :student_id, class_name: 'Student'
  end
end
  1. has_one Indicates that this table is a one-to-one relationship with the owner
  2. belongs_to Indicates that this table is a subordinate of a one-to-many or one-to-one relationship
  3. has_and_belongs_to_many Indicates that this table is one of the parties to a many-to-many relationship
  4. class_name The model class name of the other party that indicates the relationship (the model class name is actually the CamelCase form of the table name)
  5. foreign_key Indicates the name of the associated field on the side of the dependent table in the association
  6. primary_key Indicates the name of the association field on the side of the master table in the association
  7. join_table In a many-to-many relationship, the name of the intermediate table that is associated with two tables is indicated
  8. association_foreign_key In a many-to-many relationship, indicates the name of the field associated with the other model’s model in the intermediate table

可以参考: https://guides.rubyonrails.org/association_basics.html

Considering that the model classes are all defined under the Namespace module, a blog here is necessary.

Of course, Arql will load the ~/.arql.rb OR ~/.arql.d/init.rb file by default, regardless of which environment is selected via the -e options, so putting a fixed namespace Blog in the default initialization file like in the example above is not a good choice.

There are two ways to solve this problem:

1. When using arql, for different environments, use -i the option to specify different initialization files, such as: arql -e blog -i ~/.arql.d/blog.rb

  1. Refer to Put the initialization code for different environments in different files