2015-08-02 8 views
2

У меня есть одна модель, file.rb, контроллер, filecontroller.rb и набор видов для таблицы под названием files. Это было сделано для загрузки файлов Excel, чтобы я мог просматривать список в индексном представлении, когда кто-то загружал файл Excel, время его создания и имя человека, который загрузил файл Excel.Рубин на рельсах. Модельные ассоциации

Теперь у меня есть еще одна модель, bottle.rb, контроллер, bottlecontroller.rb и набор представлений для таблицы в базе данных под названием bottles. Столбцы в таблице бутылок в базе данных такие же, как файлы Excel.

У меня уже есть возможность загружать файлы excel после некоторых проверок, чтобы они могли перейти в таблицу files в базе данных. И я также следовал руководству по рельсам, чтобы иметь возможность импортировать файл excel из индекса индекса бутылки и обновлять таблицу bottles.

Однако, я хотел бы иметь возможность загрузить файл Excel и импортировать информацию в виде индекса файла. Но импорт также должен обновлять информацию в таблице бутылок. Другими словами, импорт Excel из представления индекса файла должен иметь возможность обновлять базу данных таблицы бутылок.

Я знаю, что мне нужна ассоциация между моей моделью files.rb и моделью bottles.rb .., но любая помощь была бы потрясающей!

************ Обновленный Вопрос ******************************** *********

В моем filecontroller.rb, я добавил @file.bottles = Bottle.import(params[:file_url]) в метод создания после сохранения. Я храню файлы excel в :file_url. Я также добавил ассоциацию в моей file.rb модели has_many :bottles

def create 
    ......... 
    .......... 
    if file.save 
    @file.bottles = Bottle.import(params[:file_url]) 
    end 
end 

И в моей модели бутылки bottle.rb У меня есть

def self.import(file_url) 
    spreadsheet = Roo::Excel.new(file_url.path, packed:nil,file_warning: :ignore) 
    ......... 
    bottle.save! 
end 

Но я получаю неопределенный метод path' for nil:NilClas error in this line таблицу = Роо :: Excel.new (file_url.path, упакован: nil, file_warning:: ignore) `Это не распознавание file_url как путь к файлу Excel.

+0

Вы посмотрели http://guides.rubyonrails.org/association_basics.html? – mysmallidea

+0

@mysmallidea Спасибо за ссылку! Я просмотрел руководство, но я не уверен, как импортировать данные из файлов excel из представления индексного файла, который связан с его собственной парой контроллеров/модели в таблицу бутылок, которая имеет свои собственные представления/контроллер и модель. –

ответ

1

двумя способами: либо сделать это в контроллере, либо использовать обратный вызов в своей модели.

Если вам нужно выполнить это действие только тогда, когда пользователь импортирует данные из определенного вида, вы можете обрабатывать его внутри контроллера. Например, если загрузить файл первенствовать на ваш взгляд индексного файла вызывает действие «создать» в files_controller.rb, вы можете сделать что-то вроде:

if @file.save # update bottle database using data from @file end

Однако, если вы хотите, чтобы это делать каждый раз, создается новый файл через представление или нет, вы можете добавить обратный вызов after_create к вашей модели file.rb. Если вы хотите, чтобы это выполнялось каждый раз после его сохранения, вы можете выполнить обратный вызов after_save.

+0

Спасибо за ответ. Я новичок в ROR, поэтому каждая вещь в этот момент полезна. Проблема, с которой я сталкиваюсь, заключается в том, как интегрировать шаги импорта внутри файла files_controller. Я выполнил процедуру в учебнике Railscast «Импорт Excel», в котором я создал метод импорта в моем контроллере бутылок и модели, чтобы открыть файл Excel в модели бутылки, а затем импортировать его в базу данных бутылок. Поэтому теоретически я могу вызвать метод импорта моей модели бутылки в файловом контроллере после if.save в действии create? –

+0

да, что должно сработать. Когда контроллер делает 'if @ file.save' , который сохраняет файл. к базе данных. Если он будет корректно сохранен, он вернет true и перейдет в блок после инструкции if. поэтому вы можете позвонить 'Bottle.create_from_file (@file)' Или что бы вы ни создали из файловой функции для бутылки, и это сделает это. –

+0

Хорошо, поэтому, если я создал метод класса в bottles.rb, называемый 'def self.import (file_url)'. Поэтому в моем файле filecontroller.rb после сохранения я попытался вызвать «Bottle.import (params [: file_url])» после «if.save», но я получаю ошибку в модели bottles.rb, говорящей, что file_url равен нулю. Атрибут File_url - это место, где файл excel загружается (используя CarrierWave) в виде индекса файла. Однако файл excel не переносится. Итак, следуя вашим советам, я мог бы сделать что-то вроде: Bottle.import (@ file.file_url) после if @ file.save? Я ценю вашу помощь! Немного перегружен. =] –

0

Хорошо После если @file.save

Я добавил Bottle.import(@file.file_url.path)

И в bottle.rb модели, я изменил

spreadsheet = Roo::Excel.new(file_url.path, packed: nil,file_warning: :ignore) 

в

spreadsheet = Roo::Excel.new(file_url, packed: nil,file_warning: :ignore) 

И БУМ!

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