2016-04-09 31 views
0

'daki bir tam sayıyı tanımakta başarısız olursa sıfır değer ekleme. Denetleyicimde, tek, eşleşen bir tamsayı değerini koparmam ve sonra başka bir tabloda bu değerle bir kayıt oluşturmam gerekir. eylem, bu şuna benzer: Ben first değişken tanımlanabilir olması konsolda test ettikRails 4

if Participation.where(ranking: "1") 
     first = PointsAllocation.where(game_id: params[:game_id]).where(place: "1").pluck(:points) 
     Stack.create(game_id: params[:game_id], user_id: current_user.id, chips: first) 
    else 

    end 

.

SELECT "points_allocations"."points" FROM "points_allocations" WHERE "points_allocations"."game_id" = 1 AND "points_allocations"."place" = 1 => [10]

Tamam, doğru şekilde Points için bir tamsayı değeri neye benzediğini koparma edilir: Ben PointsAllocation.where(game_id: "1").where(place: "1").pluck(:points) çalıştırırsanız, o dönecektir. Daha sonra bu puan değerini kullanmak ve Stack tablosundaki Chips sütununa göndermek istiyorum. Bunu çalıştırdığınızda, bu nedenle gibi first tanımlanmış olsa bile bir nil kaydını ekler:

sorunların giderilmesini <Stack id: 1, game_id: 1, user_id: 1, chips: nil>

, belki burada konudur düşünce bir tamsayı benziyor (ve Chips rağmen , Ekleyelim, t.integer özniteliğidir), belki de yanlışlıkla bir dize veya pluck bir şey. Bu yüzden, kopmadan sonra map(&:to_i) ekleyerek bunu güvenli bir tamsayıya eşleyelim.

Ben şimdi döner gibi, tuhaflaşıyor, bunu

: Ben bir tamsayı dönüştürmek zaman

<Stack id: 9, game_id: 1, user_id: 1, chips: 0>

Yani, bir 0 10 değiştirir ve tabloya ekler.

Neredeler?

cevap

2

yerine ActiveRecord::Association tek nesne yükleme bunu çözebilir:

first = PointsAllocation.where(game_id: params[:game_id]).where(place: "1").first 
points = first.points 
Stack.create(game_id: params[:game_id], user_id: current_user.id, chips: points) 

Sorun AR onlar sütun türü ile farklı yazarsanız yanlış değerler dönüştürmek çalışıyor olmasıdır:

Stack.create(chips: 10) 
#=> <Stack id: ..., chips: 10> 
Stack.create(chips: [10]) 
#=> <Stack id: ..., chips: nil> 
Stack.create(chips: "10") 
#=> <Stack id: ..., chips: 10> 
Stack.create(chips: "first") 
#=> <Stack id: ..., chips: 0> 
+0

Yep, sadece yakalandı. Bir alternatif: dokümantasyonu okuduktan sonra, "pluck" tek bir değer olsa bile bir dizi döndürür. '.first' kullanarak, bir tamsayıya dönüştürür ve oluşturma yönteminde başarıyla kullanılabilir. Teşekkürler! – darkginger