2016-07-25 2 views
0

Я разбираю CSV-файл и строковый столбец, который должен быть логическим. Значения: «Y» или «N». Я хотел бы обрабатывать их в обратном вызове и вставлять в виде boolean. Возможно ли это с помощью обратных вызовов activerecord?Установить атрибут activerecord для boolean из строки перед сохранением

Rails 5.0.0 

CSV:

RULE_TYPE,DESCRIPTION,STANDARD_OPTION 
OY,One,Y 
TN,Two,N 

миграция:

... 
    t.boolean :standard_option 
... 

Модель:

class OptionRule < ApplicationRecord 
    before_validation :standard_option_bool 
    private 
    def standard_option_bool 
    puts self.standard_option 
    self.standard_option=="Y" ? self.standard_option=true : self.standard_option=false 
    end 
end 

рельсы с

2.3.1 :001 > OptionRule.create(rule_type:'OY', description:"One", standard_option: 'Y') 
    (0.1ms) BEGIN 
true 
SQL (0.6ms) INSERT INTO "option_rules" ("rule_type", "description", "standard_option", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "rule_type" [["rule_type", "OY"], ["description", "One"], ["standard_option", false], ["created_at", 2016-07-25 10:34:06 UTC], ["updated_at", 2016-07-25 10:34:06 UTC]] 
(6.2ms) COMMIT 
=> #<OptionRule rule_type: "OY", description: "One", standard_option: false, created_at: "2016-07-25 10:34:06", updated_at: "2016-07-25 10:34:06"> 

Обратите внимание, что он возвращает «истина» для команды puts, а не «Y». Я должен думать, что activerecord трансформирует это перед обратными вызовами.

+0

Вы можете разместить код, где разбор его? Там было бы лучше. –

+0

Что случилось с тем, что вы написали? Есть ли проблемы с вашим кодом? Мне кажется на первый взгляд. – Caillou

+0

Это дословно то, что у меня есть. Все равно вставляет как false, когда standard_option: 'Y' – Mro

ответ

1

Да, вы можете это сделать. Даже это будет работать

class OptionRule < ApplicationRecord 
    before_validation :standard_option_bool 

    private 

    def standard_option_bool 
    self.standard_option = standard_option == "Y" 
    end 
end 
+0

Это выглядит правильно, но, похоже, не работает - вставки как false w/standard_option: 'Y' puts self.standard_option возвращает true перед вставкой. Возможно ли, что activerecord преобразует тип до того, как он коснется моей модели? – Mro

0

Попробуйте прохождение 1 (истина) и 0 (ложь) для булевых столбцов.

class OptionRule < ApplicationRecord 
    before_validation :standard_option_bool 

    private 
    def standard_option_bool 
    self.standard_option=="Y" ? self.standard_option = 1 : self.standard_option = 0 
    end 
end 
+0

Обратите внимание, что он возвращает «true» для команды puts, а не «Y». Я должен думать, что activerecord трансформирует это перед обратными вызовами. – Mro

+0

, если вы изменили столбец от строки до логического, он вернет true – Sravan

0

пожалуйста попробуйте это

class OptionRule < ApplicationRecord 
    before_validation :standard_option_bool 

    private 

    def standard_option_bool 
    self.standard_option = self.standard_option == "Y" ? true : false 
    end 
end 
0

Я работал вокруг проблемы, создавая временную переменную.

class OptionRule < ApplicationRecord 
    attr_accessor :standard_option_temp 
    before_save :standard_option_bool 
    private 

    def standard_option_bool 
    #puts self.standard_option_temp 
    self.standard_option = standard_option_temp == "Y" 
    end 
end 

Тогда просто установить OptionRule.standard_option_temp и пусть проверки установлено логическое значение

Смежные вопросы