我有模型Student
和控制器StudentsController
。ActiveRecord和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>]>
我不知道如何得到這個工作
請編輯您的問題以正確縮進您的代碼。目前閱讀起來非常困難,不太可能吸引高質量的答案。 –
@Jordan,我編輯,不知道,但可能現在看起來更好 –