Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 访问连接表_Ruby On Rails_Ruby_Sequel - Fatal编程技术网

Ruby on rails 访问连接表

Ruby on rails 访问连接表,ruby-on-rails,ruby,sequel,Ruby On Rails,Ruby,Sequel,如果我有两个具有多对多关系的表: 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 fo

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

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

我的问题是如何使用Sequel模型分配值和检索
num\u days\u
属性?

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

在您的
学生
书籍
模型中,添加这些模型和连接表之间的
一对多
关系(参考连接表中的外键)

然后创建一个
StudentsBook
模型,您将在其中设置连接表和其他表之间的
多对一关系

但首先,在连接表中设置主键:

然后将模型设置为如下所示:

class-Student:学生号,
:right\u key=>:book\u id,
:join\u table=>:学生\u书籍
一对多:学生书籍,:key=>:学生id
def借用(bk)
添加书籍(bk)
结束
结束
类书:book_id,
:right\u key=>:学生号,
:join\u table=>:学生\u书籍
一对多:学生书籍,:key=>:学生id
结束
班级学生用书<续集::模型(:学生用书)
多对一:书
多对一:学生
结束
现在,您可以访问连接表中的任何列:

s1=Student.create(:name=>'Hari')
b1=Book.create(:title=>Foundation)
s1.添加_书(b1)
s1.学生\书本。第一次[:借来的天数]=10
s1.students\u books.first.save
把学生的书放在第一位
#=>10,:学生id=>1,:书本id=>1}>

还要注意连接表和模型名称的多元化。首先,在连接表方面可能会有点棘手。

使用一对多的连接模型是一种方法(正如前面提到的三个),但是您也可以通过添加一个
:select=>[:books.*,:students\u books\u num\u days\u looked]选项来使用现有的
多对多的书籍
关联。然后在返回的图书实例上,使用
book[:num\u days\u borroed]
获取值

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

s1.borrowed(b1)
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}>