2016-11-09 4 views
1

В моем приложении пользователь может импортировать места из файла XLSX:Rails5/как установить значение атрибута по умолчанию для импортируемых объектов

контроллер мест:

def import 
    Place.import(params[:file]) 
    respond_to do |format| 
     format.html { redirect_to admin_places_url, notice: 'Places were successfully imported.' } 
     format.json { head :no_content } 
     end 
    end 

Согласно моей модели - каждый место belongs_to: состояние и

validates :status, 
      presence: true, 
      uniqueness: false, 
      inclusion: {in: Status.all} 

Я хочу установить статус по умолчанию (status_id) для импортированных мест - если у них их нет.

after_initialize :set_default_values, unless: :persisted? 

и

def set_default_values 
    self.status_id = 2 if # ??? 
    end 

Мой вопрос: как определить метод set_default_values?

Обновление:

Мое решение, которое работает:

def self.import(file) 
    spreadsheet = open_spreadsheet(file) 
    puts spreadsheet.inspect 
    header = spreadsheet.row(1) 
    (2..spreadsheet.last_row).each do |i| 
     row = Hash[[header, spreadsheet.row(i)].transpose] 
     place = find_by_id(row["id"]) || new 
     row["status_id"] = DEFAULT_STATUS if row["status_id"]==nil # NEW 
     place.attributes = row.to_hash #works for xlsx doesn't work for csv - unknown attributes for Place. 
     place.save! 
    end 
    end 

def set_default_values 
    self.status_id = DEFAULT_STATUS if self.status_id.nil? 
    end 

ответ

0

Вот быстрый и грязный образец:

require 'active_record' 

ActiveRecord::Base.establish_connection(
    adapter: 'sqlite3', 
    database: 'test.db' 
) 

unless ActiveRecord::Base.connection.table_exists?(:rows) 
    ActiveRecord::Base.connection.create_table :rows do |t| 
    t.string :status_id 
    t.string :name 
    end 
end 

class Row < ActiveRecord::Base 
    after_initialize :set_default_values, unless: :persisted? 

    DEFAULT_STATUS = 5 

    def set_default_values 
    self.status_id = DEFAULT_STATUS if self.status_id.nil? 
    end 

end 

s1 = Row.new(name: "No status") 
s2 = Row.new(name: "Has status", status_id: 1) 

[s1,s2].each do |s| 
    puts "Name: #{s.name}, Status: #{s.status_id}" 
    puts 
end 

Выход:

Name: No status, Status: 5 

Name: Has status, Status: 1 

[Finished in 0.349s] 
+0

хммм я не думаю, что мне нравится это решение ... любые другие идеи? – MaciekR

+0

@MaciekR Это то же самое решение, о котором вы говорили, вам просто нужно self.status_id = DEFAULT_STATUS, если self.status_id.nil? (и, конечно, константа DEFAULT_STATUS). –

+0

Не работает (отсутствует статус status_id) - в моей модели. Что я сделал (он работает, но я не уверен, что это лучшее решение): я добавил строку ["status_id"] = DEFAULT_STATUS, если строка ["status_id"] == nil в моем self.import (файле) метод – MaciekR

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