模型中的范围声明不起作用

时间:2012-07-05 16:01:01

标签: ruby-on-rails ruby-on-rails-3

我正在使用Ruby on Rails 3并且我在我的对象类中创建了一些范围但是当我从我的代码中调用它时它会返回错误:

  

IRB> Transaction.first.committed

     

=>对于#

,未定义的方法“提交”

对象类:

  

class Transaction<的ActiveRecord ::基

 attr_accessible :amount, :description, :published, :task_description_id, :discrete_task_id, :transaction_type

 belongs_to :discrete_task

 scope :committed, where(:transaction_type => "committed")

 scope :obligated, where(:transaction_type => "obligated")

 scope :expensed, where(:transaction_type => "expensed")
     

2 个答案:

答案 0 :(得分:0)

您不能在单个Transaction对象(实例)上调用范围(类方法)。

你必须这样做:

Transaction.committed

您返回ActiveRelation(基本上是Array,但您可以调用其他范围)。

无论如何,你期望Transaction.first.committed做什么?你有一个单独的对象,然后你会尝试找到它transaction_type被“提交”的位置。您已经拥有该对象,因此您可以调用其#transaction_type方法。

范围将带回所有事务对象,这些对象的事务类型为已提交。如果您想要一个实例方法来告诉您是否提交了单个对象,那么您必须创建一个实例方法,如:

def committed?
  transaction_type == "committed"
end

然后你可以写:

Transaction.first.committed? # => true

答案 1 :(得分:0)

Transaction.first会返回Transaction个对象,因此您无法在其上调用where。尝试:

Transaction.committed.first