1

如果我有两个具有 many_to_many 关系的表:

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

我有以下续集课程:

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

将 one_to_many 与连接模型一起使用是一种方法(正如 Threeve 所提到的),但您也可以通过添加一个选项来使用现有many_to_many books关联。:select=>[:books.*, :students_books__num_days_borrowed]然后在返回的书籍实例上,用于book[:num_days_borrowed]获取值

于 2013-02-22T23:09:33.220 回答
1

您需要向 Sequel 提供有关您的模型的更多信息。

在您的StudentBook模型中,添加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 回答