Has_many through query



我有两个模型(Books和Authors(和第三个连接它们的表(has_many通过关联(。

我正在尝试在我的应用程序中实现搜索,并在两个表上运行查询。我的查询看起来像这样,我无法解决问题:

Book.includes(:authors, :author_books).where("books.title LIKE ? OR authors.name = LIKE ?", "%#{book}%", "%#{book}%")

这就是我运行它时遇到的错误:

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "authors"
SELECT "books".* FROM "books" WHERE (books.title LIKE '%Harry%' OR authors.name = LIKE '%Harry%')

这是我的三个表的模式:

create_table "author_books", force: :cascade do |t|
t.bigint "author_id"
t.bigint "book_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["author_id"], name: "index_author_books_on_author_id"
t.index ["book_id"], name: "index_author_books_on_book_id"
end
create_table "authors", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "books", force: :cascade do |t|
t.string "title"
t.text "description"
t.string "image"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "rating"
t.string "critics"
t.float "price"
end

author_book.rb

class AuthorBook < ApplicationRecord
validates_presence_of :author, :book
belongs_to :author
belongs_to :book
end

author.rb

class Author < ApplicationRecord
validates :name, uniqueness: true
has_many :author_book
has_many :books, through: :author_book
end

book.rb

class Book < ApplicationRecord
validates :title, uniqueness: true, :case_sensitive => false
has_many :author_book
has_many :authors, through: :author_book
has_many :categories, through: :category_book
def self.search_book(book)
if book
Book.joins(:authors, :author_books).includes(:authors, :author_books).where("books.title LIKE ? OR authors.name = LIKE ?", "%#{book}%", "%#{book}%")
end
end  
end

我在我的图书控制器中这样调用这个search_book方法:

def search
@books = Book.search_book(params[:book])
end

请帮忙,好吗?谢谢

来自文档

如果您想为包含的模型添加条件,您必须明确引用它们。

也就是说,您需要像下面这样将references(:authors)添加到查询中以解决错误

Book.includes(:authors, :author_books).where("books.title LIKE ? OR authors.name = LIKE ?", "%#{book}%", "%#{book}%").references(:authors)

更新:

无法将"Book"加入名为"author_books"的关联;也许你拼错了吗?

您应该用has_many :author_books替换has_many :author_book,用through: :author_books替换through: :author_book

您忘记将authors和author_books加入您的关系。CCD_ 6加载CCD_ 7和CCD_。

试试这个:

Book.joins(:authors, :author_books).includes(:authors, :author_books).where("books.title LIKE ? OR authors.name = LIKE ?", "%#{book}%", "%#{book}%")

相关内容

  • 没有找到相关文章

最新更新