2015-08-03 3 views
1

У меня был следующий код в моем действии на создание. tasks_comtroller.rbКак вызвать метод в контроллере?

def create 
    @task = current_user.tasks.build(task_params) 
    @task.complete = false 

    n=1 
     loop do 
     unless Task.find_by priority: n 
      @task.priority=n 
      break 
     end 
     n+=1 
     end 

    respond_to do |format| 
    if @task.save 
     format.html { redirect_to user_tasks_path(current_user) } 
     format.js 
    else 
     format.html { render action: 'new' } 
     format.js 
    end 
    end 
    end 

Тогда я вынул какую-то часть я сделал метод внутри моей модели задачи.

class Task < ActiveRecord::Base 

def priority_increment 
    n=1 
     loop do 
     unless Task.find_by priority: n 
      @task.priority=n 
      break 
     end 
     n+=1 
     end 
    end 
end 

Как я могу корректно вызвать этот метод с контроллера?

+1

Thats действительно неэффективно, так как каждая итерация должна сделать запрос к базе данных - вместо того, чтобы сделать 'Task.order (: приоритет) .first' и пусть база данных выполняет свою работу. – max

+0

@max Можете ли вы привести пример того, как должен выглядеть этот код, чтобы я мог принять ваш ответ? Я использую это для увеличения приоритета. –

+0

@max Я просто не совсем понимаю вашу линию. –

ответ

1

Это действительно неэффективно, так как каждая итерация должна выполнять запрос базы данных - вместо этого делать Task.order(:priority).first и позволить базе данных выполнять эту работу.

class Task < ActiveRecord::Base 
    def self.heighest_priority 
    # .try lets us handle the case where there 
    # are no Tasks gracefully 
    p = Task.order(:priority).first.try(:priority) 
    # return the highest + 1 or 1 if there are no tasks. 
    p ? p + 1 : 1 
    end 
end 

не Вызов методов в рубин в точно такой же, независимо от того, где вы вызываете функцию:

obj.some_method # in Ruby the parens are optional 
obj.some_method(someArg) 
obj.some_method(someArg) do 
    # blocks are awesome. 
end 

Здесь мы имеем метод класса - мы называем его Task.heighest_priority.

Так позволяет реорганизовать метод создания, чтобы использовать наш новый метод:

def create 
    @task = current_user.tasks.build(task_params) do |t| 
    t.priority = Task.heighest_priority 
    t.complete = false 
    end 
    if @task.save 
    format.html { redirect_to user_tasks_path(current_user) } 
    format.js 
    else 
    format.html { render action: 'new' } 
    format.js 
    end 
end 
+0

Высоко ценится;) –

1

Если вы хотите поставить эту часть кода в модели, вы должны вызвать self вместо переменной экземпляра @task так:

class Task < ActiveRecord::Base 

def priority_increment 
    n=1 
     loop do 
     unless Task.find_by priority: n 
      self.priority=n 
      break 
     end 
     n+=1 
     end 
    end 
end 

После этого вы можете вызвать его на экземпляре задачи:

@task.priority_increment 
Смежные вопросы