PG :: UndefinedTable:错误:缺少FROM子句 - 使用两个模型Rails进行搜索

时间:2017-09-04 14:20:14

标签: ruby-on-rails join

我的目标网页上有一个搜索栏,我可以搜索来自不同大学的用户的书籍。当它被重定向到Book Index Page时似乎不接受.joins。本书属于用户,用户有很多书。

我总是得到:

PG :: UndefinedTable:错误:表"用户"

缺少FROM子句条目

BooksController.rb

def index
  if params[:book][:title].present? && params[:users][:university].present?
  @books = Book.where({title: params[:book][:title]})
  .joins(:user).where(user: {university: params[:users][:university]}).uniq
  end
end

PagesController.rb

def home
  @books = Book.new
end

这是我在simple_form中的搜索:

<%= simple_form_for [@books], url: books_path, method: :get do |f| %>
  <ul class="list-inline">
    <li><%= f.input :title, placeholder: "Title", label: false %></li>
    <%= simple_fields_for :users do |r| %>
      <li><%= r.input :university, placeholder: "University", label: false %></li>
    <% end %>
  </ul>
    <%= f.button :submit, 'search', class: "btn"  %>
<% end %>

的routes.rb

resources :books do
  resources :users
end

完整错误是:

        

第1行:...&#34;图书&#34;。&#34; user_id&#34;在哪里&#34;书籍&#34;。&#34;标题&#34; = $ 1 AND&#34;用户&#34;。&#34;联合国......                                                                ^   :SELECT DISTINCT&#34; books&#34;。* FROM&#34; books&#34; INNER JOIN&#34;用户&#34; ON&#34;用户&#34;。&#34; id&#34; =&#34;书籍&#34;。&#34; user_id&#34;在哪里&#34;书籍&#34;。&#34;标题&#34; = $ 1 AND&#34;用户&#34;。&#34;大学&#34; = $ 2&gt;

3 个答案:

答案 0 :(得分:5)

where方法希望收到确切的表名(请参阅此处的完整示例:How to query a model based on attribute of another model which belongs to the first model?):

@books = Book.where({title: params[:book][:title]})
@books = @books.joins(:user).where(users: {university: params[:users][:university]}).uniq
#                     ^ relation name  ^ exact name of the table

如果由于某种原因,存储User记录的表的名称被命名为utilisateurs,那么where用法将是:

@books = Book.joins(:user).where(utilisateurs: { name: 'Bob' })

答案 1 :(得分:1)

尝试使用与用户的复数形式的关系来大学查询,例如:

Book.where('title = ?', params[:book][:title])
    .joins(:user)
    .where(users: { university: params[:users][:university] }).uniq

答案 2 :(得分:0)

在使用.includes(:user)进行过滤之前,请确保提供where,以避免ERROR: missing FROM-clause entry for table