Een nieuw object construeren in Rails dat deel uitmaakt van een actieve recordkoppeling

Dit is slechts een eenvoudige vraag. Ik probeerde een nieuw object in Rails te maken door parameters door te geven aan de constructor. Echter, wanneer ik de code uitvoer, krijg ik

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

wat betekent dat het object niet goed wordt geconstrueerd. Moet ik maken gebruiken in plaats van nieuw ? Dat werkt ook niet.

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
0
user.awards probeert de awards van de gebruiker te laden, heeft u de relatie correct ingesteld en is de migratie uitgevoerd?
toegevoegd de auteur Dave Newton, de bron
ah, je hebt gelijk, user.awards is niet goed ingesteld. ken je de documentatie die ik kan bekijken?
toegevoegd de auteur kyothine, de bron

1 antwoord

Have you add has_many :awards to the User model? Have you added belongs_to :user to the Award model? Have you added the column user_id to the Award model (using a migration)? You'll need to do these three things to be able to use the user.awards method you're using. Read the Rails Guide on Associations for more detail.

Also, append isn't a ruby method - the closest method would be <<. You would use it like this:

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

U kunt dit echter in één coderegel samenvoegen met de methode create :

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

EDIT: om de kolom user_id in het Award -model te maken, voert u de volgende code uit vanaf het eindstation (in de directory van uw app):

rails generate migration AddUserIdToAward user_id:integer
rake db:migrate
1
toegevoegd
Is user.awards.append (a) een geldige verklaring? Ik heb het nog nooit eerder gezien (append) en geprobeerd het in de documenten te vinden en kon het niet.
toegevoegd de auteur Steve, de bron
Kan toevoegen nergens vinden - had niet mogen aannemen dat het geldig was! Het lijkt erop dat << het dichtst bij is toegevoegd in Ruby. Zal het antwoord bewerken.
toegevoegd de auteur Rob d'Apice, de bron
bedankt. ik had de documenten nu al opgezocht, maar dit is de kern van wat ik heb toegevoegd
toegevoegd de auteur kyothine, de bron