SQLite3 :: SQLException: нет такого столбца: проблема с ассоциацией и представлением представления - PullRequest
2 голосов
/ 19 июля 2011

Я получаю следующее сообщение об ошибке в представлении: http://localhost:3000/microposts/2 SQLite3 :: SQLException: нет такого столбца: answers.micropost_id: ВЫБРАТЬ «ответы». * ОТ «ответы» ГДЕ («ответы» .micropost_id= 2)

Вот мои миграции:

|БД> миграция> создать микросообщение |

class CreateMicroposts < ActiveRecord::Migration
  def self.up
    create_table :microposts do |t|
      t.string :content

      t.timestamps
    end
  end

  def self.down
    drop_table :microposts
  end
end

|db> миграция> создать ответ |

class CreateAnswers < ActiveRecord::Migration
  def self.up
    create_table :answers do |t|
      t.string :location
      t.text :body
      t.references :micropost
      t.integer :micropost_id

      t.timestamps
    end

  end

  def self.down
    drop_table :answers
  end
end

Контроллер ответов:

def create

    @answer = Answer.new(params[:answer])
    @answer.micropost = @micropost; @answer.save && @micropost.save


    redirect_to micropost_path(@micropost)




    respond_to do |format|
      if @answer.save
        format.html { redirect_to(@answer, :notice => 'Answer was successfully created.') }
        format.xml  { render :xml => @answer, :status => :created, :location => @answer }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @answer.errors, :status => :unprocessable_entity }
      end
    end
  end

и просмотр:

<p id="notice"><%= notice %></p>

<p>
  <b>Content:</b>
  <%= @micropost.content %>
  <h2>Location Answers:</h2>
  <% @micropost.answers.each do |answer| %>

    <p>
      <b>Answer:</b>
      <%= answer.body%>
    </p>
    <%end %>

  <h2> Answer a location:</h2>
  <%= form_for ([@micropost, @micropost.answers.build]) do |f| %>
    <div class="field">
      <%= f.label :location %><br />
      <%= f.text_field :location %>
    </div>
    <div class="field">
      <%= f.label :body %><br/>
      <%= f.text_area :body %>
    </div>
    <div class="actions">
      <%= f.submit %>
    </div>
    <% end %>

</p>

<%= link_to 'Edit', edit_micropost_path(@micropost) %> |
<%= link_to 'Back', microposts_path %>

Я не могу найти, что не так в этом приложении,- Я попытался откатить и перенести снова, это не сработало.- Я попытался вручную добавить «t.integer: micropost_id» в миграцию, которая не работала. В моей модели есть ассоциация «own_to» и «has_many», и я добавил «ресурсы: микросообщения делают ресурсы: ответы заканчиваются в моей конфигурации.рб файл.

Ответы [ 2 ]

2 голосов
/ 05 июня 2012

Вам не нужно устанавливать micropost_id в вашей миграции.Это делается с помощью t.references

create_table :answers do |t|
  t.string :location
  t.text :body
  t.references :micropost

  t.timestamps
end

Рекомендации по настройке и индексированию, например:

add_index :answers, :micropost_id
2 голосов
/ 19 июля 2011

Я полагаю, что для ассоциации has_many требуется таблица отношений, к которой необходимо присоединиться.Если у вас есть has_one и own_to (связь один к одному), то вы работаете с простым методом столбца _id, но has_many этого не сделает.Поэтому, если вы поместите эту таблицу соединений и опишите has_many через нее, вы должны получить то, что хотите.

Вот действительно хорошее руководство по ассоциациям rails , которое я использую, когда этот материал становится неяснымдля меня.

...