2016-05-29 7 views
0

上のRubyで「訪問」カウンターを作る私は現在にhas_manyCheck_Ins belongs_toの私のSubscriberモデルというCheck_Inモデルを持っています。アクティブレコード。 Railsの

Subscriberモデルは、他の属性とともにphone_numberを取り入れ、Check_Inモデルは "visit_amount"を整数として取ります。私はCheck_Inビュー形式で自分のsubscriber PHONE_NUMBERを配置することにより、Check_Inにそれらのオプションをしたいビューのフォームを持つ人Subscribes

Check_Inの形式で番号を付けた後、そのモデルの「visit_amount」に+1します。Subscriber

私はレールが新しく、これが可能かどうか疑問に思っていますか?もしそうなら、この機能を実装するにはどうすればいいですか?現在のコードを参考にして表示します。

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 

私は基本的なコントローラとビューを持っています。この時点ではすべてが本当に基本的ですが、これは私がこのアプリに必要な主要機能です。

+0

私の携帯電話から簡単に実行できるので、入力する時間が必要です。 – bkunzi01

+0

ありがとう!ヘルプに感謝してください – Bitwise

答えて

1

ここでは、使用例の作成アクションを示します。

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 

希望します。

アプリで認証を持っていない場合、あなたは

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

最終を行うことができ、あなたのフォームは次のようになります。

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

form_for @check_inを使用しないでくださいまたはあなたのparamsは{ check_in: { phone_number: '1234-56-7890' }のようになります。作成アクションでparams[:check_in][:phone_number]を取得する必要があります。これは私には不快感を与えます(チェックインには電話番号がありません)。

+0

これは確かに役立ちます。唯一の問題は、私は彼らがcurrent_userになるとは思わないということです。基本的には、入力された番号が存在するかどうかを示すSQLクエリを作成したいのですか?特定の番号のカウンタに1を加えます。それが意味をなさえすれば? – Bitwise

+0

2番目の解決策を使用して、 'counter_cache'を試してください。 – floum

+0

ありがとうございます。私のフォームがビューのためにどのように見えるのでしょうか? text_fieldの場合はどうなりますか? – Bitwise

1

:counter_cacheは、必要な処理を実行できます。その後、次のようにクラス定義を更新し、テーブルの加入者に新しいフィールドコールcount_of_check_insを追加します。

class Subscriber < ActiveRecord::Base 
    has_many :check_ins 
end 

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

count_of_check_insが自動的に更新されます。フォームは、チェックインのためのユーザ入力を受け付けるようにしたいページで

+0

私の場合は、ユーザーが自分の電話番号を入力した場合にのみカウントすることが重要です。それは私の状況のた​​めに働くでしょうか? – Bitwise

+0

私はあなたが思っているものが好きです。あなたが精巧にできれば私はちょうど興味があると思いますか? – Bitwise

+0

私は単純な宣言がそのトリックを行うことができるかどうかわかりません。あなたのケースでは、Check_Inモデルの中にafter_updateとafter_destroyコールバックを追加し、計算を自分自身で行うことをお勧めします。 – nickcen

1

(通常CheckinsControllernewアクションだろう)、それに対応するアクションに次のように置く:

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 

次に、あなたのモデルにCheckIn電話番号を追加できるように、accepts_nested_attributes_forを追加する必要があります。

関連する問題