2016-05-10 13 views
0

Ich habe zwei Modelle, die beide die has_and_belongs_to_many Assoziation miteinander haben.Schienen 5 Active Record has_and_belongs_to_many

Bestellen

class Order < ApplicationRecord 
# Has multiple related rates. 
    has_and_belongs_to_many :rates 

Rate

class Rate < ApplicationRecord 
    has_and_belongs_to_many :orders 

Rate Währungsdaten für ein bestimmtes Datum enthält, während um eine Frist enthält. Ich habe eine Arbeit, die eine Frist des Auftrags gibt, schafft und holt alle Daten zwischen (heute..deadline) - 1 Jahr.

Job

def perform(order_record) 
    (all_dates << history_weeks).flatten! 
     all_dates.each do |date| 
      r = Rate.find_by(date: date) 
      if r == nil 
      r = Rate.new(date: date) 
      r.save 
      end 

      q = r.update(orders << order_record) 
     end 

Jetzt ist die Sache, die für die erste Bestellung, dass ich schaffen, alles reibungslos läuft, sind die Verbände richtig gemacht, so dass ich die Preise durch @order.rates zugreifen kann. 2. und jede weitere damit ich schaffen macht das nicht, trotz der folgenden Anmeldung, aber nur einmal:

Rate Load (0.0ms) SELECT "rates".* FROM "rates" INNER JOIN "orders_rates" ON "rates"."id" = "orders_rates"."rate_id" WHERE "orders_rates"."order_id" = ? ORDER BY "rates"."id" ASC LIMIT ? [["order_id", 4], ["LIMIT", 1]]

Was mache ich da falsch gemacht?

Edit:

Der Job in der orders_controller aufgerufen:

def create 
    @order = Order.new(order_params) 
    @order.user = User.find(current_user) 

    respond_to do |format| 
    if @order.save 
     GetCurrencyHistoryJob.perform_now(@order) 
     format.html { redirect_to @order, notice: 'Order was successfully created.' } 
     format.json { render :show, status: :created, location: @order } 
    else 
     format.html { render :new } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
    end 
    end 
end 
+0

Können Sie nach dem Code, wo Sie den Job –

Antwort

0

Ich habe noch nie gesehen r.update(orders << order_record)

Die Syntax habe ich immer gesehen habe, ist

r.orders << order_record 

Sie können auch diese

aufräumen
r = Rate.find_by(date: date) 
if r == nil 
    r = Rate.new(date: date) 
    r.save 
end 

zu

r = Rate.find_or_create_by(date: date) 
+0

'r.orders nennen << order_record' produziert genau das gleiche Ergebnis: Die erste Fein rollt, machen die Nächsten nicht . –