Rails, если функция не отправляет before_create - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь установить логическое значение на основе значения другого поля.

Однако на выходе консоли выдается ненулевое нарушение:

  Gin Create (124.6ms)  INSERT INTO "gins" ("gin_name", "snippet", "description", "abv", "created_at", "updated_at", "slug") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["gin_name", "Seedlip"], ["snippet", "Alcohol free gin"], ["description", "Seedlip have inspired alcohol free gin"], ["abv", 0.0], ["created_at", "2019-02-01 09:21:30.080931"], ["updated_at", "2019-02-01 09:21:30.080931"], ["slug", "seedlip"]]
   (0.3ms)  ROLLBACK
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR:  null value in column "alcoholic" violates not-null constraint)
DETAIL:  Failing row contains (56, Seedlip, Alcohol free gin, Seedlip have inspired alcohol free gin, 0, 2019-02-01 09:21:30.080931, 2019-02-01 09:21:30.080931, null, seedlip, null).
: INSERT INTO "gins" ("gin_name", "snippet", "description", "abv", "created_at", "updated_at", "slug") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"

таблица джина

  create_table "gins", force: :cascade do |t|
    t.string "gin_name"
    t.string "snippet"
    t.text "description"
    t.float "abv"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "distillery_id"
    t.string "slug"
    t.boolean "alcoholic"

модель gin.rb

class Gin < ApplicationRecord

    before_create :is_alcoholic

    has_one :distillery
    has_many :botanicals_gin
    has_many :botanicals, through: :botanicals_gin

    validates :gin_name, :snippet, :description, presence: true
    validates :gin_name, uniqueness: true

    def is_alcoholic
      if abv > 0.1
        alcoholic = true
      end
    end

Я пробовал несколько различных обратных вызовов перед сохранением (я понимаю, это будет запускаться is_alcoholic на новоми обновленные записи) и before_validation (не уверен, что это применимо, так как у меня нет проверки в модели для alcoholic.

Из консоли у меня нет четкого понимания, является ли эта функциядаже пытаясь запустить.

Я пропускаю что-то базовое?

Обновление Благодаря ответам ниже я получил следующее, которое работает для обоих условий:

def is_alcoholic
  if abv == 0.0
    self.alcoholic = false
  else
    self.alcoholic = true
  end
end

Я смоделировал столбец, так как хочу использовать его в качестве фильтра при поиске.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вы должны добавить self к методу is_alcoholic:

def is_alcoholic
  if abv > 0.1
    self.alcoholic = true
  end
end

, если вы не используете self в этом методе, ruby ​​просто обозначает локальную переменную alcoholic = true, но вы на самом деле ссылаетесьприписать.

0 голосов
/ 01 февраля 2019

В журнале говорится, что вы пытаетесь создать запись, где abv равно 0.0.Поэтому условие, сформулированное вами в is_alcoholic, будет ложным, что приведет к тому, что alcoholic не будет иметь значения.

Попробуйте изменить реализацию на:

def is_alcoholic
  self.alcoholic = abv > 0.1
end

Таким образом, всегда будетбыть значением, установленным для alcoholic, и оно в любом случае будет более информативным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...