1

many_to_many 関係を持つ 2 つのテーブルがある場合:

DB.create_table? :students do
  primary_key    :id
  String         :name
end

DB.create_table? :books do
  primary_key    :id
  String         :title
end

DB.create_table? :students_books do
  Integer        :num_days_borrowed

  foreign_key    :student_id,
                 :students,
                 :key => :id,
                 :allow_null => false

  foreign_key    :book_id,
                 :books,
                 :key => :id,
                 :allow_null => false
end

次の Sequel クラスがあります。

class Student < Sequel::Model(:students)
  many_to_many  :books,
                :left_key => :student_id,
                :right_key => :book_id,
                :join_table => :students_books

  def borrowed(bk)
    add_book(bk)
  end
end

class Book < Sequel::Model(:books)
  many_to_many  :books,
                :left_key  => :book_id,
                :right_key  => :student_id,
                :join_table  => :students_books
end

これで、次のように生徒に本を追加できます。

s1 = Student.create(:name => 'Hari')
b1 = Book.create(:title => 'Foundation')

s1.borrowed(b1)

num_days_borrowed私の質問は、 Sequel モデルを使用して値を割り当て、属性を取得するにはどうすればよいですか?

4

2 に答える 2

1

モデルに関する情報を Sequel に提供する必要があります。

StudentおよびBookモデルで、これらのモデルとジャンクション テーブル間の関係を追加しますone_to_many(ジャンクション テーブルの外部キーを参照します)。

次に、ジャンクション テーブルと他のテーブル間のリレーションシップStudentsBookを設定するモデルを作成します。many_to_one

ただし、最初に、ジャンクション テーブルに主キーを設定します。

DB.create_table :students_books do
  # add columns, etc
  primary_key [:student_id, :book_id]
end

次に、モデルを次のように設定します。

class Student < Sequel::Model(:students)
  many_to_many  :books,
                :left_key => :student_id,
                :right_key => :book_id,
                :join_table => :students_books
  one_to_many   :students_books, :key=>:student_id

  def borrowed(bk)
    add_book(bk)
  end
end

class Book < Sequel::Model(:books)
  many_to_many  :books,
                :left_key  => :book_id,
                :right_key  => :student_id,
                :join_table  => :students_books
  one_to_many   :students_books, :key=>:student_id
end

class StudentsBook < Sequel::Model(:students_books)
  many_to_one :book
  many_to_one :student
end

これで、ジャンクション テーブルにある任意の列にアクセスできます。

s1 = Student.create(:name => 'Hari')
b1 = Book.create(:title => 'Foundation')

s1.add_book(b1)
s1.students_books.first[:num_days_borrowed] = 10
s1.students_books.first.save

puts StudentsBook.first.inspect
  #=> #<StudentsBook @values={:num_days_borrowed=>10, :student_id=>1, :book_id=>1}>

また、ジャンクションテーブルとモデル名の複数形にも注意してください。ジャンクション テーブルに関しては、最初は少し注意が必要です。

于 2013-02-22T17:08:20.997 に答える
1

結合モデルで one_to_many を使用することは (Threeve が述べたように) それを行う 1 つの方法ですが、オプションmany_to_many booksを追加することで、既存の関連付けで行うこともでき:select=>[:books.*, :students_books__num_days_borrowed]ます。次に、返された本のインスタンスでbook[:num_days_borrowed]、値を取得するために使用します

于 2013-02-22T23:09:33.220 に答える