0

我有一个模型 Dish 和 PriceDeal 如下

class Dish < ActiveRecord::Base
  has_one :price_deal
end

class Dish < ActiveRecord::Base
  belongs_to :dish
end

在 Rails 控制台中,我想像这样检索 discountPercent 值。

1.9.2p290 :130 > pd=PriceDeal.find(17)
 => #<PriceDeal id: 17, name: "deal1", description: "my deal1", discountPercent: 20.0, discountCash: nil, dish_id: 2, created_at: "2012-03-22 07:42:08", updated_at: "2012-04-16 11:16:49"> 

1.9.2p290 :131 > pd.discountPercent
 => 20.0 

我得到了预期的结果。

但是当我试图获得这样的价值时,

1.9.2p290 :132 > pd1 = PriceDeal.where(:dish_id => 2)
 => [#<PriceDeal id: 17, name: "deal1", description: "my deal1", discountPercent: 20.0, discountCash: nil, dish_id: 2, created_at: "2012-03-22 07:42:08", updated_at: "2012-04-16 11:16:49">] 

1.9.2p290 :133 > pd1.discountPercent

NoMethodError: undefined method `discountPercent' for #<ActiveRecord::Relation:0xa134958>
    from /home/ragunathjawahar/.rvm/gems/ruby-1.9.2-p290@rails3tutorial/gems/activerecord-3.0.11/lib/active_record/relation.rb:374:in `method_missing'
    from (irb):133
    from /home/ragunathjawahar/.rvm/gems/ruby-1.9.2-p290@rails3tutorial/gems/railties-3.0.11/lib/rails/commands/console.rb:44:in `start'
    from /home/ragunathjawahar/.rvm/gems/ruby-1.9.2-p290@rails3tutorial/gems/railties-3.0.11/lib/rails/commands/console.rb:8:in `start'
    from /home/ragunathjawahar/.rvm/gems/ruby-1.9.2-p290@rails3tutorial/gems/railties-3.0.11/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

我有错误,

如何从 pd1 中获取 discountPercent 的值。

谢谢。

4

2 回答 2

4

发生这种情况的原因是,当您使用 时where,您得到的不是一个类型的对象PriceDeal,而是一个类型的对象ActiveRecord::Relation,从所有意图和目的来看,它都是一个数组。

注意你是如何得到的:

[#<PriceDeal id: 17, name: "deal1", ... >]

而不仅仅是:

#<PriceDeal id: 17, name: "deal1", ... >

大括号 ( []) 表示它是一个数组。所以你必须这样做:

pd1.first.discountPercent

where方法返回数组的原因是您可以返回多个项目。想象一下:

PriceDeal.where("discountPercent >= 0")

你可能会从中得到很多记录。

于 2012-04-16T14:03:33.093 回答
0

pd=PriceDeal.find(17)

它只会返回一个特定的列。因此您不会收到任何方法错误。

当您使用 Modelname.where("conditions")。结果将是数组。因此您不会收到任何方法错误。因为您的方法不存在于数组中。

于 2012-04-18T14:00:32.723 回答