Проблемы с сохранением идентификаторов в отношениях belongs_to

#ruby-on-rails #has-many #belongs-to

#ruby-on-rails #имеет-много #принадлежит

Вопрос:

У меня есть 3 объекта: пользователи, путешествия, точки.

У пользователя много путешествий, у путешествия много точек, точка принадлежит одному путешествию для одного пользователя.

У путешествия также есть логический атрибут (:open), который сообщает, находится ли оно в curse или нет.

Проблема в том, что я не могу сохранить «travel_id» текущего путешествия в моей таблице очков.

Вот код:

 class Point < ActiveRecord::Base
    belongs_to :travel, :foreign_key=> "travel_id"
    belongs_to :user, :foreign_key=> "user_id"
end


class Travel < ActiveRecord::Base
    has_one :user, :foreign_key => "user_id"
    has_many :ways
    has_many :points
    attr_accessible :description, :start_date, :last_date
    validates_date :last_date, :on_or_after => :start_date
end
  

Контроллер точек:

 ...
 def create
   @point = Point.new(params[:point])
   @point.user_id = current_user.id
   @travel = current_user.travels.find(:all, :conditions => {:open => true})
   @point.travel_id = @travel.id
   respond_to do |format|
     if @point.save
       format.html { redirect_to(@point, :notice => 'Point was successfully created.') }
       format.xml  { render :xml => @point, :status => :created, :location => @point }
     else
       format.html { render :action => "new" }
       format.xml  { render :xml => @point.errors, :status => :unprocessable_entity }
     end
   end
 end
...
  

Каждый раз, когда я пытаюсь сохранить новую точку, @point.travel_id = -614747648

Ответ №1:

Здесь можно было бы исправить несколько вещей.

Во-первых, вам не нужно указывать, :foreign_key когда ключ совпадает с именем отношения _id .

Во-вторых, вам не нужно (и, как правило, не следует) устанавливать foo_id поля напрямую; это более привычно делать @point.user = current_user .

В-третьих, и это прямая причина вашей проблемы, заключается в том, что @travel был установлен результат find(:all, ...) вызова — так что это массив Travel объектов. То, что вы сохраняете в @point.travel_id , будет внутренним идентификатором Ruby для @travel массива, а не идентификатором базы данных для одной строки.

Комментарии:

1. Я изменил @point.travel_id = @travel[0], и это работает отлично. Действительно, действительно спасибо вам за все.