ruby - 续集——查询多对多关联

标签 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

我正在尝试确定访问给定图书馆的所有书名的正确方法。我最初尝试遵循 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)

这似乎让我部分了解了。但是,当我使用序列化扩展时,在转换结果时出现错误:

undefined method `book_id' for #<LibraryGame:0x007fa9e904b470>

任何对此的深入了解都将非常有帮助!

最佳答案

尝试以下操作:

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

注意将 libraries_books 表重命名为 books_libraries 并使用 foreign_key 指令实现参照完整性。约定应该让事情顺利进行。

Library[7].books  # returns all books for library '7'

或者:

Book.where(libraries: Library[7])

或多个库:

Book.where(libraries: Library.where(id: [3,7,9]))

如果 sequel 无法对 Library/Libraries 进行词形变化,那么您可能需要添加自己的 inflection rule ,例如:

Sequel.inflections do |inflect|
  inflect.irregular 'Library', 'Libraries'
end

关于ruby - 续集——查询多对多关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258371/

相关文章:

ruby - 无法使用 Selenium WebDriver 在 Safari 中单击按钮

jquery 二维 JSON

json - 如何强制将请求正文解析为纯文本而不是 Express 中的 json?

c# - 从 SqlDataReader 创建 JSON 字符串

ruby-on-rails - 如何在 Rails 中的对象上构建子关联而不保存父对象?

arrays - 如何组合匹配模式的数组中的元素?

ruby-on-rails - `build_extensions':错误:无法构建 gem native 扩展。 ( gem ::安装程序::ExtensionBuildError)

ruby - XInclude 包含元素的命名空间

java - Grails:删除所有关联的对象

attributes - 绘制 UML 时何时使用属性(property)而不是关联/聚合/组合