2015-12-22 24 views
0

我有模型Student和控制器StudentsControllerActiveRecord和PORO方法

我有這個代碼在控制器:

def create_students_list 
    @students=[...#some code which evaluates to array of student instances] 
    result=list_transaction(@students) 
    ... 
    end 
     private 
     def list_transaction(collection, options= {}) 
      errors=[] 
      ActiveRecord::Base.transaction do 
      collection.each do |item| 
      if item.save 
      else 
      errors << item.errors 
      end 
      end 
      end 
     if errors.any? 
     {:success=>false, :errors => errors } 
     else 
     {:success => true} 
     end 
    end 

的想法是:我有一個很大的量的投入,這是我想在事務中擠包。還有一些其他的邏輯,而不是這裏的問題。 但我想DRY控制器,也需要其他控制器的相同操作,所以我決定使用PORO方法:具有可重用的純Ruby對象。

class List 
    include ActiveRecord 
    include ActiveRecord::Transactions::ClassMethods 

    def initialize(collection) 
    @collection=collection 
    end 

    def group_input 
    outputs={:valid=>[], :invalid=>[]} 
    @collection.each do |element| 
     if element.valid? 
     outputs[:valid] << element 
     else 
     outputs[:invalid] << [element, element.errors] 
     end 
     end 
    if outputs[:valid].any? 
    save_list(outputs[:valid]) 
    outputs[:something_saved]=true 
    outputs[:valid].delete 
    end 
    save_list(outputs[:valid]) 
    if outputs[:invalid].empty? 
    outputs = {} 
    outputs[:all_records_saved]=true 
    else 
    outputs=outputs[:invalid] 
    end 
    outputs 
    end 

    private 
    def save_list(collection) 
    ActiveRecord::Base transaction do 
     collection.each do |element| 
     element.save 
     end 
    end 
    end 
    end 

問題:它會導致一個錯誤:

NameError: 
     undefined local variable or method `connection' for #<List:0x000001073a62d8 @collection=[#<Student id: nil>]> 

試過inclide的ActiveRecord :: ConnectionsHandler,這也提高:

NameError: 
     undefined local variable or method `connection_handler' for #<List:0x0000010c285480 @collection=[#<Student id: nil>]> 

我不知道如何得到這個工作

+3

請編輯您的問題以正確縮進您的代碼。目前閱讀起來非常困難,不太可能吸引高質量的答案。 –

+0

@Jordan,我編輯,不知道,但可能現在看起來更好 –

回答

1

看來你還需要包括其他的ActiveModel類以及

class List 
    include ActiveRecord::Base.transaction 

    extend ActiveModel::Naming 
    include ActiveModel::Conversion 
    include ActiveModel::Validations 

    #... rest of the code 
end 
+0

不,這並沒有解決問題,但是,只是改變語法到'ActiveRecord :: Base.transaction'看起來像activesupport解釋語法沒有點到這一個回控制器 –

+0

@JoeHalfFace_Good Catch_!我完全忘了。 – VKatz