基本数据库关联

时间:2012-01-13 03:08:15

标签: ruby-on-rails database ruby-on-rails-3 associations

我正在尝试关联两个模型 - AthletesResults

他们有以下字段: 运动员 - :name :year :gender
结果 - :name :event :performance

我已将belongs_to :athlete添加到results.rb&将has_many :results添加到athletes.rb

我想使用:name属性作为用于关联两个模型的主键,因为目的是让所有运动员最初上传,然后只使用结果输入到本赛季的剩余时间。 / p>

我已将results_controller编辑为以下内容:

def create
#this was the initial code....
#@result = Result.new(params[:result])

# This is the new code to try set up an association
@athlete = Athlete.where('name = ?', 'Peter')
@result = @athlete.results.create(params[:result])

respond_to do |format|
  if @result.save
    format.html { redirect_to @result, notice: 'Result was successfully created.' }
    format.json { render json: @result, status: :created, location: @result }
  else
    format.html { render action: "new" }
    format.json { render json: @result.errors, status: :unprocessable_entity }
  end
end

然而,这会产生错误undefined method 'results' for #<ActiveRecord::Relation:0x36a2b28>。我也希望使用行@athlete = Athlete.where("name = ?", params[:name]),但它不断产生NULL参数值......

有人能够指出我正确的方向吗?

额外信息: 结果迁移

class CreateResults < ActiveRecord::Migration   def change
 create_table :results do |t|
   t.string :name
   t.string :event
   t.decimal :performance

   t.timestamps
 end

#add in new line here   
add_index :results, :name

end end

运动员迁移

class CreateAthletes < ActiveRecord::Migration
  def change
    create_table :athletes do |t|
      t.string :name
      t.integer :year
      t.string :gender

      t.timestamps
    end
  end
end

Result.rb:

class Result < ActiveRecord::Base
     belongs_to :athlete
 end

Athlete.rb

class Athlete < ActiveRecord::Base
     has_many :results
 end

2 个答案:

答案 0 :(得分:1)

问题是Athlete.where('name = ?', 'Peter')返回ActiveRecord :: Relation对象。使用

Athlete.where('name = ?', 'Peter').first

或动态查找方法

Athlete.find_by_name('Peter')

修改

另外,请务必将t.references :athlete添加到结果表格中。

答案 1 :(得分:1)

您的结果表需要存储athlete_id。

create_table :results do |t|
 t.references :athlete
 t.string :name
 t.string :event
 t.decimal :performance
 t.timestamps
end

引用将使用rails约定(在本例中为athlete_id)创建外键关联