2013-06-23 81 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