Rails 5 Active Record has_and_belongs_to_many

时间:2016-05-10 10:29:25

标签: ruby-on-rails

我有两个模型,它们之间都有has_and_belongs_to_many个关联。

顺序

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

class Rate < ApplicationRecord
  has_and_belongs_to_many :orders

费率包含给定日期的货币数据,而订单包含截止日期。我有一份工作,在订单截止日期之前,创建并获取(今天......下线) - 1年之间的所有日期。

工作

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

现在的问题是,对于我创建的第一个订单,一切运行顺利,关联正确,以便我可以通过@order.rates访问费率。我创建的第二个和下一个订单不会这样做,尽管记录了以下内容,但只记录一次:

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]]

我在那里做错了什么?

编辑:

在orders_controller中调用作业:

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

1 个答案:

答案 0 :(得分:0)

我从未见过r.update(orders << order_record)

我一直看到的语法是

r.orders << order_record

你也可以整理这个

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

r = Rate.find_or_create_by(date: date)