ruby-on-rails – Rails:ActiveRecord :: HasManyThroughSourceAssociationNotFoundError:找不到源关联

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails:ActiveRecord :: HasManyThroughSourceAssociationNotFoundError:找不到源关联前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码(有点简化…
  1. create_table :signatures do |t|
  2. t.integer :signer_id
  3. t.integer :card_id
  4.  
  5. t.timestamps
  6. end

模型看起来像…

  1. class Signature < ActiveRecord::Base
  2. belongs_to :card
  3. belongs_to :user
  4. end
  5.  
  6. class Card < ActiveRecord::Base
  7. has_many :signatures
  8. has_many :signers,:through => :signatures,:foreign_key => "card_id"
  9. end
  10.  
  11.  
  12. class User < ActiveRecord::Base
  13.  
  14. has_many :sent_cards,:class_name => "Card",:foreign_key => "sender_id"
  15. has_many :received_cards,:foreign_key => "recipient_id"
  16.  
  17. has_many :signatures
  18. has_many :signed_cards,:foreign_key => "signer_id"
  19.  
  20. end

我使用rails控制台看到以下错误

  1. ruby-1.9.2-p0 > u15.signed_cards
  2. ActiveRecord::HasManyThroughSourceAssociationNotFoundError: Could not find the source association(s) :signed_card or :signed_cards in model Signature. Try 'has_many :signed_cards,:source => <name>'. Is it one of :card or :user?
  3. from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/reflection.rb:517:in `check_validity!'
  4. from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/associations/association.rb:27:in `initialize'
  5. from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/associations/collection_association.rb:24:in `initialize'
  6. from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/associations.rb:164:in `new'
  7. from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/associations.rb:164:in `association'
  8. from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/associations/builder/association.rb:41:in `block in define_readers'
  9. from (irb):11
  10. from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.1.0/lib/rails/commands/console.rb:45:in `start'
  11. from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.1.0/lib/rails/commands/console.rb:8:in `start'
  12. from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.1.0/lib/rails/commands.rb:40:in `<top (required)>'
  13. from script/rails:6:in `require'
  14. from script/rails:6:in `<main>'

我得到相同的事情,当我添加source => :卡/:用户(应该是:在这种情况下我相信卡).

任何想法我在这里做错什么?

显示部分解决方案,因为我想清理一个
一些事情.迁移与以前的版本保持一致.我现在
看到sql错误(见下文),它在Signature中找不到user_id.一世
讨厌说,但大多数我一直在加入:foreign_key whereever我想
他们可能无济于事.

  1. class Signature < ActiveRecord::Base
  2. belongs_to :card
  3. belongs_to :signer,:class_name => "User"
  4. end
  5.  
  6.  
  7. class Card < ActiveRecord::Base
  8. # Correct
  9. has_many :signatures
  10. has_many :signers,:source => :user
  11.  
  12. end
  13.  
  14. class User < ActiveRecord::Base
  15. # Wrong!
  16. has_many :signatures,:foreign_key => "signer_id"
  17. has_many :signed_cards,:source => :card
  18. end

随着错误(减堆栈跟踪)

  1. ruby-1.9.2-p0 > u15.signed_cards
  2. Card Load (0.5ms) SELECT "cards".* FROM "cards" INNER JOIN "signatures" ON "cards"."id" = "signatures"."card_id" WHERE "signatures"."user_id" = 15 ORDER BY cards.created_at DESC
  3. sqlite3::sqlException: no such column: signatures.user_id: SELECT "cards".* FROM "cards" INNER JOIN "signatures" ON "cards"."id" = "signatures"."card_id" WHERE "signatures"."user_id" = 15 ORDER BY cards.created_at DESC
  4. ActiveRecord::StatementInvalid: sqlite3::sqlException: no such column: signatures.user_id: SELECT "cards".* FROM "cards" INNER JOIN "signatures" ON "cards"."id" = "signatures"."card_id" WHERE "signatures"."user_id" = 15 ORDER BY cards.created_at DESC

Card.signers按预期返回一个空数组.

还在寻找一些这方面的帮助.我无法找到很简单,直接的解释方式,你不使用相同的名字(即你需要一个foreign_key和来源).

解决方法

用户应该这样定义:
  1. class User < ActiveRecord::Base
  2.  
  3. has_many :sent_cards,:foreign_key => "sender_id"
  4. has_many :received_cards,:foreign_key => "recipient_id"
  5.  
  6. has_many :signatures
  7. has_many :signed_cards,:source => :card
  8.  
  9. end

当您的关联名称与以下使用的名称不同时:您必须定义源参数.如果你查看异常消息,它会明确地要求你这样做.

猜你在找的Ruby相关文章