在Rails中构造一个新对象,它是活动记录关联的一部分

时间:2012-06-24 00:54:09

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

这只是一个简单的问题。我试图通过将参数传递给构造函数来在Rails中创建一个新对象。但是,当我执行代码时,我得到了

SQLite3::SQLException: no such column: awards.user_id: SELECT "awards".* FROM "awards"  WHERE "awards"."user_id" = 1

表示对象未正确构造。我应该使用创建而不是 new 吗?这也不起作用。

def refresh_awards(user)

new_awards = []

if (user.karma < 40 ) #test award

    a = Award.new(:name => "Nobody Award", :description => "From Jonathan", :category => "Community", :value => 1337, :level => 0, :handle => "nobody_award")
    user.awards.append(a)
    new_awards.append(a)

end

new_awards.each do |a|

    flash[:notice] = "You received the " + a.name + "!"

end

end

1 个答案:

答案 0 :(得分:1)

您是否已将has_many :awards添加到User模型中?您是否已将belongs_to :user添加到Award模型中?您是否已将user_id列添加到Award模型(使用迁移)?您需要执行以下三项操作才能使用您正在使用的user.awards方法。请阅读Rails Guide on Associations了解更多详情。

此外,append不是Ruby方法 - 最接近的方法是<<。你可以这样使用它:

a = Award.new(:name => "Nobody Award", :description => "From Jonathan", :category => "Community", :value => 1337, :level => 0, :handle => "nobody_award")
user.awards << a

但是您可以使用create方法将其整合到一行代码中:

a = user.awards.create(:name => "Nobody Award", :description => "From Jonathan", :category => "Community", :value => 1337, :level => 0, :handle => "nobody_award")

编辑:要在user_id模型中创建Award列,请从终端运行以下代码(在应用目录中):

rails generate migration AddUserIdToAward user_id:integer
rake db:migrate