Wenn Sie user.participations.select(:prize)
sagen, machen Sie eine Abfrage an die db, um Werte in den Preisspalten der Benutzerbeteiligung zu erhalten. Aber wenn Sie before {participation.prize = 100}
sagen, setzen Sie nur den Preis Attribut auf dem Teilnahmeobjekt. Versuchen Sie, die Teilnahme vor der Auswahlleitung zu speichern:
participation.prize # => 100
participation.save
user.participatons.select(:prize) # => nil
Ein weiteres mögliches Problem ist, dass user.participations
wurde von einem früheren Aufruf memoized worden. Stellen Sie sicher, dass user.participations.first == participation
. Ist dies nicht der Fall ist, überprüfen
1) puts participation.user_id
und
2) puts user.participations, user.reload.participations
schließlich einen besseren Weg, den Test einrichten, so dass Sie in dieser Frage laufen weniger häufig ist etwas, entlang der Linien von:
# let(:price) { 0 } # default price. Optional so that tests won't throw errors if you forget to set it in a context/describe block.
let(:user) {FactoryGirl.create :user}
let!(:participation) {FactoryGirl.create :participation, user: user, price: price}
# ...
context "when ..." do
let(:price) { 100 }
it "" do
binding.pry
end
end
auf diese Weise wird der Preis gesetzt, wenn Sie das Modell erstellen. Diesem Muster zu folgen bedeutet in der Regel, weniger auf dieses Problem einzugehen.