ассоциация append_to/has_many выдает NoMethodError: неопределенный метод

В моем коде есть 3 модели, все с ассоциацией «принадлежит_к/имеет_многие». Он выдает NoMethodError, когда я пытаюсь извлечь таблицы из таблицы ассоциаций моих объектов с помощью консоли rails и в моих представлениях.

Рассматриваемые модели:

class Coin < ActiveRecord::Base
  # If coin is destroyed, so is their market prices
  has_many :market_prices, dependent: :destroy
  has_many :networks, dependent: :destroy
end

class MarketPrice < ActiveRecord::Base
  belongs_to :coin
end

class Network < ActiveRecord::Base
  belongs_to :coin
end

Рельсовая консоль:

2.0.0-p247 :004 > Coin.find_by_tag("btc").networkhashrate                                                          Coin Load (0.3ms)  SELECT "coins".* FROM "coins" WHERE "coins"."tag" = 'btc' LIMIT 1                                                                                                                     
NoMethodError: undefined method `networkhashrate' for #<Coin:0x00000005b15030>                                                                                                                             
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-4.0.0/lib/active_model/attribute_methods.rb:436:in `method_missing'                                                                   
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/attribute_methods.rb:131:in `method_missing'                                                                 
        from (irb):4                                                                                                                                                                                       
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'                                                                                        
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'                                                                                         
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'                                                                                     
        from bin/rails:4:in `require'                                                                                                                                                                      
        from bin/rails:4:in `<main>'   

Другой пример:

2.0.0-p247 :005 > coin = Coin.first                                                                                                                                                                        
  Coin Load (0.3ms)  SELECT "coins".* FROM "coins" ORDER BY "coins"."id" ASC LIMIT 1                                                                                                                       
 => #<Coin id: 1, created_at: "2014-04-02 02:44:01", updated_at: "2014-04-02 02:44:01", tag: "10-5", name: "10-5", website: "">                                                                            
2.0.0-p247 :006 > coin.coin_id                                                                                                                                                                             
NoMethodError: undefined method `coin_id' for #<Coin:0x00000005b1c920>                                                                                                                                     
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-4.0.0/lib/active_model/attribute_methods.rb:436:in `method_missing'                                                                   
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/attribute_methods.rb:131:in `method_missing'                                                                 
        from (irb):6                                                                                                                                                                                       
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'                                                                                        
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'                                                                                         
        from /home/action/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'                                                                                     
        from bin/rails:4:in `require'                                                                                                                                                                      
        from bin/rails:4:in `<main>' 

Схема.rb:

ActiveRecord::Schema.define(version: 20140402005453) do

  create_table "coins", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "tag"
  end

  create_table "market_prices", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "coin_id"        
  end

  create_table "networks", force: true do |t|
    t.integer  "networkhashrate"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "coin_id"
  end

end

Я не могу идти ни в ту, ни в другую сторону. Пример: Coin.find_by_tag("btc").networkhashrate или Network.find_by_coin_id("83").tag

У меня есть почти такая же установка в другом приложении, которое я написал, и оно работает отлично. Я перезагрузил консоль rails/перезапустил среду разработки. Почему рельсы не видят мою ассоциацию?

Спасибо, что нашли время, чтобы прочитать это.


person kruptos    schedule 03.04.2014    source источник


Ответы (1)


Coin.find_by_tag("btc").networkhashrate

Coin.find_by_tag возвращает монету. У монет нет метода, называемого networkhashrate, у сетей есть.


Network.find_by_coin_id("83").tag

Network.find_by_coin_id возвращает сеть. В сетях нет метода tag, в монетах он есть.

person Logan Serman    schedule 03.04.2014
comment
Чтобы добавить: Coin.find_by_tag("btc").networks.map(&:networkhashrate) должно работать, как и Network.find_by_coin_id("83").coin.tag; а coin.coin_id должно быть coin.id. - person Amadan; 03.04.2014
comment
Спасибо за ответ. Можете ли вы объяснить, почему я не мог использовать Coin.find_by_tag(btc).networks.networkhashrate, но аналогичный синтаксис работает для Network.find_by_coin_id(83).coin.tag? - person kruptos; 03.04.2014
comment
В первом примере используется networks, который возвращает набор сетей, во втором примере используется coin, который возвращает один экземпляр Coin. - person Logan Serman; 04.04.2014