2017-01-12 10 views
0

私の最初の投稿はここにありますので、私は必要な情報をすべて含んでいることを願っています!満足しています。まだ質問をしなくても、2ヶ月間学習することができました。 :-)特定のパラメータに基づいて既存のレコードのネストされた属性を設定する

新しいCallsheetが毎月送信されるたびに更新したいlastvisit列を含むネストされたStoreレコードを持つCallsheetsレコードがあります。 :lastvisitフィールドは、Store:id == @ callsheet.store_idがすでに定義されている場所で更新する必要があります。私の中で初心者には、「更新」メソッドの正しいコードが

@callsheet.update(callsheet_params).where(@callsheet.store_id => @store.id) 

だろうと思ったが、私は、このインスタンスで@storeにアクセスするかどうかはわかりません、これはおそらくちょうどとにかく新しいレコードを作成します。

正しい方向のヘルプやポイントはありがたいです。ありがとう!

私はそれを 'update'メソッドで実行しようとしていましたが、もしそれが異なっていたら 'create'メソッドで実行させたいと思います。関連情報:

callsheet.rb:

class Callsheet < ActiveRecord::Base 
    belongs_to :store 
    accepts_nested_attributes_for :store 

callsheets_controller.rb:

​​

edit.html.erb:

 <%= form_for @callsheet, url: callsheet_path, remote: true, :html => { :multipart => true} do |f| %> 
      <%= f.fields_for :store do |s| %> 
      <%= s.text_field :lastvisit, :id => 'lastvisitHidden' %> 
      <% end %> 
     <%= f.hidden_field :store_id, :id => 'storeSelectHidden' %> 

//

+0

':id'をnested_attributesから削除すると、' store_attributes:[:lastvisit] 'になります。 –

+0

'@ callsheet.update'や' @ callsheet'に 'where'を連鎖させることはできません。 'Callsheet'モデルか別のクエリ(' where'、 'all'、' order'など)だけです。 –

答えて

0

あなたの場合store_id coを持っているcallsheet上lumn「外部キー」と呼ばれています、そしてあなたがモデルにこれらの関連を記述することができます。

#callsheet 
belongs_to :store 

#store 
has_many :callsheets 

はその後@callsheet.update(callsheet_params)後、あなたのコントローラのアクションで:

@callsheet.store.update(last_visit: Time.now) 

これは最も単純で、そしてあります私は何をお勧めします。店舗インスタンス(。あなたは常にあなたの変数がモデルの場合、モデルのクエリ、または配列であるかどうかを追跡する必要があります)

を返し@callsheet.storeあなたは、代わりにそれだけでストアにアクセスするための別の方法を示しています、これを言うことができます:

Store.find_by(id: @callsheet.store_id).update(last_visit: Time.now) 

find_byActiveRecord query interface参照)「クエリ法」として知られているが、他のほとんどとは異なり、それは、インスタンスではなく、クエリを返します。 updateは、インスタンス上でのみ呼び出すことができ、保存が成功したかどうかを示すブール値を返します。 updateもコールバックチェーンを起動します - ActiveRecord Callbacksを参照してください。

それを行う別の方法:

Store.where(id: @callsheet.store_id).update_all(last_visit: Time.now) 

これは、クエリを返す.where queryメソッドを、(このケースではあなたはそれが一つの要素になります知っている)を使用し、その後、update allクエリメソッド(いコールバックチェーンを起動しません)。

最後は混乱しています。私はあなたにそれを使用することを断念します。その理由は、コール・シートにはストアが1つしかないため、配列としてロードすると誤解を招くからです。

+0

ありがとうございます!あなたは、Active Recordに関する今後5つの質問についてもお答えしました。 Store.find_byメソッドは私が使い終わったものです。しかし、「belongs_to:store_id」行は機能しませんでしたが、「belongs_to:store」行は機能しませんでした。です:このインスタンスのstore_idはStore.idまたはCallsheet.store_idを参照していますか? –

+0

@TylerP yahあなたは正しくタイプミスでした。 –

関連する問題