2

次のシナリオで適切なモデル、関連付け、およびクエリを作成し、Ruby で Sequel を使用して結果を 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>

提供できることについての洞察は非常に役立ちます!

4

1 に答える 1

6

次のことを試してください。

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

続編が Library/Libraries の語形変化を実行できない場合は、独自の語形変化規則を追加する必要がある場合があります。たとえば、次のようになります。

Sequel.inflections do |inflect|
  inflect.irregular 'Library', 'Libraries'
end
于 2014-07-01T05:17:06.263 に答える