2016-03-21 34 views
-1

UI aracılığıyla kullanıcılardan veri almam gereken bir DB uygulamasına sahibim, herhangi bir hıçkırık olmadan yapabileceğim bir DB'de saklamak. Ancak depolanan verileri DB'den almalı ve üzerlerinde bazı hesaplamalar yapmalı ve daha sonra bunları bir grafik kütüphanesi kullanarak çizmeliyim.Rails Uygulamasında Hesaplama Mantığı

Bu hesaplama mantığının genellikle modele ait olduğunu okudum, dolayısıyla model dosya kodum aşağıda listelenmiştir. Ama şimdi, sonuç dizilerimi bir görünüme nasıl aktaracağım ve nasıl çizileceğini merak ediyorum. Temelde arabağlantıyı doğru alamıyorum. Bu konuda herhangi bir yardım çok takdir edilecektir.

class Shot < ActiveRecord::Base 
    def self.calculate(param) 
    #fetch_all_three_shots 
    #Performs Query aginst DB and returns the same data structure depicted in 'shots' array 
    #shots = Shot.all.collect{|a| [a.c1,a.c2,a.c3,a.c4,a.c5,a.c6,a.c7,a.c8,a.c9,a.c10,a.c11,a.c12]} 
    #shots = [[1.55, 1.58, 1.59, 1.58, 1.53, 1.57, 1.57, 1.55, 1.57, 1.6, 1.62, 1.6], 
    #  [1.54, 1.55, 1.58, 1.57, 1.49, 1.56, 1.55, 1.55, 1.54, 1.59, 1.61, 1.6], 
    #  [1.55, 1.57, 1.59, 1.57, 1.51, 1.56, 1.56, 1.55, 1.56, 1.59, 1.62, 1.59]] 
    shots = fetch_all_three_shots 

    #Declaration of Array for all Data Sets Goes here... 
    cavity_arr = Array.new 
    avgpartwt_arr = Array.new 
    fillseq_arr = Array.new 
    imbalance_arr = Array.new 
    max_imbalance_arr = Array.new 
    intermediate_arr = Array.new 
    fillmeanwt_arr = Array.new 
    statistics_shotwise_arr = Array.new 
    statistics_bof_arr = Array.new 

    #Formulation of Cavity Array Goes Here... 
    cavity_arr = (1 .. 12).to_a 

    #Looping for Calculation of Average Part Weight Goes Here... 
    for i in (0 .. (shots[0].size - 1)) 
     avgpartwt_arr.push((shots[0][i] + shots[1][i] + shots[2][i])/3) 
    end 

    #Rank Calculation Logic Goes Here.... 
    fillseq_arr = avgpartwt_arr.map{|value| avgpartwt_arr.select{|item| item > value}.size + 1} 

    #Looping for Calculation of Percentage Imbalance Goes Here... 
    for i in (0 .. (avgpartwt_arr.size - 1)) 
     imbalance_arr.push(((avgpartwt_arr.max - avgpartwt_arr[i])/avgpartwt_arr.max) * 100) 
    end 

    #Looping for Maximum Imbalance Array Goes Here... 
    for i in (0 .. (imbalance_arr.size - 1)) 
     if imbalance_arr[i] != imbalance_arr.max 
      max_imbalance_arr.push(0) 
     else 
      max_imbalance_arr.push(cavity_arr[i]) 
     end 
    end 

    #Formulation of Intermediate Array Goes Here... 
    intermediate_arr = [((avgpartwt_arr.mean).round(3))] * 12 

    #Formulation of Fill Weight Mean Array Goes Here... 
    for i in (0 .. (avgpartwt_arr.size - 1)) 
     fillmeanwt_arr.push(((intermediate_arr[i] - avgpartwt_arr[i])/intermediate_arr[i]) * 100) 
    end 

    #Looping for Calculation of Shotwise Statistical Parameters Across Shots Goes Here... 
    for i in (0 .. (shots.size - 1)) 
     statistics_shotwise_arr.push([shots[i].max, shots[i].min, shots[i].range, shots[i].mean, shots[i].standard_deviation]) 
    end 

    #Formulation of Balance of Fill Parameters Goes Here... 
    cavmaximbalance = max_imbalance_arr.max 
    maximbalance = imbalance_arr.max 
    avgimbalance = imbalance_arr.mean 
    rangedrop = (((statistics_shotwise_arr[0][2] - statistics_shotwise_arr[2][2])/statistics_shotwise_arr[0][2]) * 100) 

    end 
    scope :fetch_all_three_shots , -> {all.collect{|a| [a.c1, a.c2, a.c3, a.c4, a.c5 ,a.c6, a.c7, a.c8, a.c9, a.c10, a.c11, a.c12]}} 
end 

cevap

0

Aşağıdaki deneyebilirsiniz: Shot.calculate(params) dönüş değeridir

class SomeController < ApplicationController 

    def some_action 
    @some_variable = Shot.calculate(params) 

    render :show_action 
    end 
end 

@some_variable, görünümde mevcuttur.

+0

Merhaba Dharam, Doğrudan model dosyasında yaptığım gibi diziler ilan edebilir miyim. İkinci soru şu anki haliyle benim fetch_all_three_shots veriyi DB'den alacak ve 'çekim' değişkenimde kullanılabilir hale getirecek mi? Ben raylar ve dolayısıyla bu noob soruları için bir acemi duyuyorum. –

+0

Evet, model dosyasında bildirdiğiniz gibi 'dizileri' bildirebilirsiniz. Ancak bu yöntemden döndürülen tek şey, yöntemin son satırı olan "rangedrop". ruby, dolaylı olarak yöntemin son ifadesini döndürür. Yani bu dizilerin kullanılabilir olmasını istiyorsunuz, sonra onları son ifade olarak ilan etmelisiniz, [cavity_arr, avgpartwt_arr, ...] gibi bir şey. – Dharam

+0

'fetch_all_three_shots', 'rayların' sınıf yöntemi olarak kullanılabilir hale getirdiği ve 'hesapla' yöntemini sınıf yöntemi olarak açıkladığınız bir kapsamdır, herhangi bir sorun görmüyorum. Genel olarak, bu iyi bir tasarım olmayabilir, çünkü test etmek zor olacak çok fazla şey yapan bir yönteminiz var. – Dharam