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)

特定の列を1つだけ返すため、メソッドエラーは発生しません。

Modelname.where( "conditions")を使用している場合、結果はarray.soになります。したがって、メソッドエラーは発生しません。メソッドが配列に存在しないためです。

于 2012-04-18T14:00:32.723 に答える