Итерация только по сохраненным объектам - PullRequest
0 голосов
/ 03 февраля 2020

Это код для моего отображения создания:

def create
    @display = @department.displays.new(display_params)
    @token = @display.build_token(value: (max_token + 1) , status: 0)

    if @display.save
        ....
end

max_token - это метод, вызываемый для поиска наибольшего количества токенов в токенах дисплея.

def max_token
  @tokens = @department.displays.map do |display|
    display.token.value
  end
  @tokens.max
end


Проблема

Я создал новый дисплей для отдела с кодом в методе создания.

@display = @department.displays.new(display_params)

Но он еще не сохранен, так как @display.save вызывается только после метода max_token .

Но когда вызывается метод max_token , код

@tokens = @department.displays.map do |display|

также отображает несохраненный дисплей отдела.

И поскольку токен дисплея еще не установлен, так как он не сохранен, выдается ноль значение ошибка.

Мое решение

Это то, что я пробовал до сих пор, но я хочу знать, есть ли лучший метод .

def max_token
      @tokens = @department.displays.map do |display|
        if display.token.nil?
          display.token.value
        else
          0
        end
      end
      @tokens.max
    end

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Если вас не беспокоит уникальность value на уровне БД, вы можете просто отфильтровать дисплеи со значением nil для token:

def max_token
  @department.displays.where.not(token: nil).map do |display|
    display.token.value
  end.max
end

(Это также при условии, что вам не нужно назначать @tokens как побочный эффект max_token.)

1 голос
/ 03 февраля 2020

Попробуйте сначала создать новый отдельный Display, затем назначьте его @department после вызова max_token, чтобы новый Display не был включен в @department.displays.map

def create
    @display = Displays.new(display_params)
    @token = @display.build_token(value: (max_token + 1) , status: 0)
    @department.displays << @display        

    if @display.save
        ....
end
...