Имеет и принадлежит многим ошибка - * _development.hunts_tasks 'не существует: - PullRequest
2 голосов
/ 31 марта 2012

Итак, я работаю над проектом, в котором есть задачи, которые составляют охоту за мусором. Поэтому, когда пользователь нажимает на конкретную охоту, я хотел бы, чтобы файл 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>

Есть идеи, что я облажался?

1 Ответ

2 голосов
/ 31 марта 2012

Я предлагаю вам подумать о переходе с has_and_belongs_to_many на has_many :through => 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, когда у людей есть вопросы, но в этом случае API действительно имеет хорошую информацию и примеры.

...