【问题标题】:Has and Belongs to Many error - *_development.hunts_tasks' doesn't exist:Has and Belongs to Many 错误 - *_development.hunts_tasks' 不存在:
【发布时间】:2023-08-09 08:11:01
【问题描述】:

所以我正在开展一个项目,其中有一些任务构成了寻宝游戏。因此,当用户单击特定搜寻时,我希望 show.html.erb 文件显示搜寻以及与该搜寻相关的任务。两种模型(Hunt.rb 和 Task.rb)彼此之间都有“has_and_belongs_to_many”关系。我的控制器最初有这段代码,但它显示了数据库中的每个任务,而不仅仅是与特定狩猎相关的任务。

  def show
    @hunt = Hunt.find(params[:id])
    @title = @hunt.name  
    @tasks = Task.paginate(:page => params[:page])
  end

所以我尝试了这个。

  def show
    @hunt = Hunt.find(params[:id])
    @title = @hunt.name    
    @tasks = @hunt.tasks.paginate(:page => params[:page]) 
  end

然后它抛出了这个错误:

    ActiveRecord::StatementInvalid in Hunts#show
    Showing /****/views/hunts/show.html.erb where line #10 raised:
    Mysql2::Error: Table '***_development.hunts_tasks' doesn't exist: SELECT  `tasks`.* FROM `tasks` INNER JOIN `hunts_tasks` ON `tasks`.`id` = `hunts_tasks`.`task_id` WHERE `hunts_tasks`.`hunt_id` = 100 LIMIT 30 OFFSET 0

这里是 show.html.erb:

    <h1>Show Hunt</h1>

    <table>
      <tr>
        <td class="main">
          <h1>
            <%= @hunt.name %>
          </h1>
            <ul>        
              <% @tasks.each do |task| %>
                 <%= render task  %>
              <% end %>
            </ul>
        </td>
      </tr>
    </table>

知道我在搞砸什么吗?

【问题讨论】:

  • 您是否创建了hunts_tasks 连接表。
  • 您是否创建了hunts_tasks 表?我相信has_and_belongs_to_many 要求您仍然创建一个表来表示关系。在这种情况下,它只是一个带有hunt_idtask_id 的简单表。见documentation

标签: ruby-on-rails many-to-many associations rails-activerecord has-and-belongs-to-many


【解决方案1】:

我建议你考虑从has_and_belongs_to_many切换到has_many :through =&gt; tbl

class Hunt < ActiveRecord::Base
  has_many :hunttasks
  has_many :tasks :through => :hunttasks
end

class HuntTask < ActiveRecord::Base

  belongs_to :hunt
  belongs_to :task

class Task < ActiveRecord::Base
  has_many :hunttasks
  has_many :hunts :through => :hunttasks
end

从长远来看,您会发现它更灵活、更易于使用,因此它是一个更好的起点。

当人们有问题时,我通常不会指向 api,但在这种情况下,the api 实际上确实有很好的信息和示例。

【讨论】:

  • 当然还可以看到我在上面添加的 api 链接 - 那里的 api 非常易读(不像很多 api!)
  • 你说得对,这是我见过的最清晰的 api。很棒的资源。谢谢!