2016-05-29 5 views
0

Ich habe derzeit ein Modell, das Check_Inbelongs_to mein Subscriber Modell, das has_manyCheck_Ins.Aktiver Datensatz. Einen "Besuch" Zähler mit Ruby on Rails

Das Subscriber Modell nimmt eine phone_number zusammen mit einigen anderen Attributen und das Modell Check_In nimmt eine "visit_amount" als Ganzzahl.

Nach einer Person Subscribes mit Blick Form ich die Option, indem sie ihre subscriber phone_number in einer Check_In Ansicht Form Check_In für sie will.

Nachdem sie ihre Nummer in das Formular Check_In Modell wird + 1 auf die "Visit_amount" auf dieser speziellen Subscriber.

Ich bin neu bei Schienen und ich frage mich, ob das möglich ist? Wenn ja, wie sollte ich dieses Feature implementieren? Ich zeige meinen aktuellen Code als Referenz.

MODEL

class Subscriber < ActiveRecord::Base 
has_many :check_ins 

validates :first_name, presence: true 
validates :last_name, presence: true 
validates :email, presence: true 
validates :phone_number, presence: true 

def date_joined 
    created_at.strftime("%-m/%-d/%-y") 
end 

def expiration_date 
    (created_at + 1.year).strftime("%-m/%-d/%-y") 
end 
end 

~

class Check_In < ActiveRecord::Base 
belongs_to :subscriber 
end 

I Grund Controller und Ansichten haben. Zu diesem Zeitpunkt ist alles sehr einfach, aber das ist das Hauptmerkmal, das ich für diese App brauche.

+0

leicht machbar, von meinem Handy beantworten müssen so einige Zeit, es zu geben lol – bkunzi01

+0

Dank! schätzt die Hilfe – Bitwise

Antwort

1

Hier ist die Erstellung Aktion für Ihren Anwendungsfall.

class CheckInsController < ApplicationController 
    def create 
    # First, create a CheckIn that belongs to the current_subscriber 
    @check_in = CheckIn.new.tap do |check_in| 
     check_in.subscriber = current_subscriber 
    end 

    # Then check if submitted phone number is correct 
    if params[:phone_number] == current_subscriber.phone_number 
     @check_in.save 
    else 
     # do something when the verification failed 
    end 
    end 

    # more code... 
end 

Hoffe, dass hilft.

Wenn Sie, keine Authentifizierung in der App haben, können Sie

tun
def create 
    subscriber = Subscriber.find_by(phone_number: params[:phone_number]) 
    if subscriber 
    CheckIn.create(subscriber: subscriber) 
    else 
    # some code 
    end 
end 

Last, sollte Ihre Form wie folgt aussehen:

<%= form_tag check_ins_path do %> 
    <%= label :phone_number %> 
    <%= text_field_tag :phone_number %> 
    <%= submit_tag 'Check In' %> 
<% end %> 

nicht form_for @check_in oder Ihre params wie { check_in: { phone_number: '1234-56-7890' } aussehen Verwenden Sie und du musst params[:check_in][:phone_number] in deiner create action holen, was sich für mich unangenehm anfühlt (checkins haben keine Telefonnummern).

+0

Das hilft sicher. Das einzige Problem ist, dass ich nicht glaube, dass sie ein current_user sein werden. im Grunde möchte ich eine SQL-Abfrage machen, die sagt, wenn Nummer, die eingegeben wurde existiert? addiere 1 zum Zähler für diese bestimmte Zahl. wenn das Sinn macht? – Bitwise

+0

Verwenden Sie die zweite Lösung und versuchen Sie 'counter_cache'. – floum

+0

Danke. eine letzte Frage, wie soll meine Form für die Ansicht aussehen? was ist, wenn das text_field für? – Bitwise

1

: counter_cache kann tun, was Sie wollen. einen neuen Feld Anruf count_of_check_ins in den Tabellen Abonnenten hinzufügen, dann die Klassendefinition wie folgt aktualisiert:

class Subscriber < ActiveRecord::Base 
    has_many :check_ins 
end 

class Check_In < ActiveRecord::Base 
    belongs_to :subscriber, counter_cache: :count_of_check_ins 
end 

die count_of_check_ins automatisch aktualisiert werden. den Benutzer Eingang für ein checkin setzte den folgend in ihren entsprechenden Maßnahmen akzeptieren (in der Regel wäre die CheckinsController, new Aktion)

+0

Es ist für meinen Fall wichtig ist, dass es zählt nur, wenn der Benutzer in ihrer Telefonnummer. Wird das für meine Situation funktionieren? – Bitwise

+0

Ich mag was du denkst. Ich denke, ich bin nur neugierig, ob du es ausarbeiten kannst? – Bitwise

+0

Ich weiß nicht, ob es eine einfache Erklärung gibt, kann diesen Trick tun. Für Ihren Fall würde ich vorschlagen, dass Sie innerhalb des Check_In-Modells einen after_update- und after_destroy-Callback hinzufügen und die Berechnung selbst durchführen. – nickcen

1

auf der Seite, wo Sie das Formular mögen:

def new 
    @checkin = Check_In.new 
end 

def create 
    user = current_user #assuming u have a current user method 
    @checkin = user.check_in.new(checkin_params) 
    if @checkin.save 
    # ... 
    end 
end 

private 

def checkin_params 
    params.require(:check_in).permit(:phone_number) 
end 

Dann in Ihrem Modell CheckIn Sie müssen accepts_nested_attributes_for hinzufügen, damit die Telefonnummer hinzugefügt werden kann.