use*_*001 2 ruby json associations sequel
我在为以下场景构建正确的模型、关联和查询时遇到问题,然后使用 Sequel 和 Ruby 将结果作为 JSON 返回。
数据库结构___
您可以创建书籍列表。每个图书馆都有书。由以下定义:
db.create_table(:books) do
primary_key :id
String :name
String :author
DateTime :created
end
db.create_table(:libraries) do
primary_key :id
String :name
String :city
String :state
DateTime :created
end
db.create_table(:libraries_books) do
Integer :library_id
Integer :book_id
primary_key [:library_id, :book_id]
end
class Library < Sequel::Model(:libraries)
many_to_many :libraries_books, :left_key=>:library_id, :right_key=>:book_id, :join_table=>:libraries_books
one_to_many :libraries_books, :key=>:library_id
end
class LibraryBook < Sequel::Model(:libraries_books)
many_to_one :libraries
many_to_one :books
end
Run Code Online (Sandbox Code Playgroud)
我正在尝试确定访问给定图书馆所有书名的正确方法。我最初尝试遵循 Sequel Associations 指南,但无法弄清楚如何使用带有关联的 LibraryBook 来获取图书馆的所有书籍并加入 Book 模型以获取正确的列。
在使用了所描述的一些方法之后,我尝试创建自己的查询:
LibraryBook.select(:books.*)
.join_table(:inner, :libraries, :id => :library_id)
.join_table(:inner, :books, :id => :book_id)
.where(:library_id => 1)
Run Code Online (Sandbox Code Playgroud)
这似乎让我部分地在那里。但是,当我使用序列化扩展时,在转换结果时出现错误:
undefined method `book_id' for #<LibraryGame:0x007fa9e904b470>
Run Code Online (Sandbox Code Playgroud)
任何可以提供的见解都会非常有帮助!
请尝试以下操作:
db.create_table(:books) do
primary_key :id
String :name
String :author
DateTime :created
end
db.create_table(:libraries) do
primary_key :id
String :name
String :city
String :state
DateTime :created
end
db.create_table(:books_libraries) do
foreign_key :library_id, :libraries, key: :id
foreign_key :book_id, :books, key: :id, index: true
primary_key [:library_id, :book_id]
end
class Library < Sequel::Model
many_to_many :books
end
class Book < Sequel::Model
many_to_many :libraries
end
Run Code Online (Sandbox Code Playgroud)
注意将libraries_books表重命名为books_libraries和使用foreign_key 指令来实现参照完整性。约定应该允许事情正常工作。
Library[7].books # returns all books for library '7'
Run Code Online (Sandbox Code Playgroud)
或者:
Book.where(libraries: Library[7])
Run Code Online (Sandbox Code Playgroud)
或多个库:
Book.where(libraries: Library.where(id: [3,7,9]))
Run Code Online (Sandbox Code Playgroud)
如果 sequel 无法为 Library/Libraries 做屈折变化,那么您可能需要添加自己的屈折变化规则,例如:
Sequel.inflections do |inflect|
inflect.irregular 'Library', 'Libraries'
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2539 次 |
| 最近记录: |