2013-06-23 65 views
1

我遇到的问题是为以下情形构建适当的模型,关联和查询,然后将结果作为使用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 

我想确定访问给定库的所有书名的正确方法。我最初尝试遵循续集关联指南,但无法弄清楚如何使用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> 

任何深入了解,可以提供将是非常有益!

+1

Yo您不会显示使用序列化插件的代码或错误的完整回溯,并且在没有该信息的情况下很难提供有用的帮助。 –

回答

3

尝试以下操作:

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_booksbooks_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])) 

如果续集不能做库/库的拐点,那么你可能需要添加自己的inflection rule ,例如:

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