在belongs_to关系中保存ID的问题

时间:2011-06-13 09:51:17

标签: ruby-on-rails has-many belongs-to

我有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 :(得分:0)

有些事情可以解决这里。

首先,当密钥与关系名称+ :foreign_key完全相同时,您无需指定_id

其次,您不需要(通常不应该)直接设置foo_id字段;做@point.user = current_user更常见。

第三,问题的直接原因是@travel已被设置为find(:all, ...)调用的结果 - 所以它是{{1> {{1}对象。您保存到Travel的内容将是Ruby的@point.travel_id数组的内部标识,而不是单行的数据库标识。