Проблемы с сохранением идентификаторов в отношении принадлежащих к - PullRequest
0 голосов
/ 13 июня 2011

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

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

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

Проблема в том, что я не могу сохранить "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 Ответ

0 голосов
/ 13 июня 2011

Несколько вещей могут быть связаны с исправлением здесь.

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

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

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

...