我有以下代码(有点简化…
create_table :signatures do |t| t.integer :signer_id t.integer :card_id t.timestamps end
模型看起来像…
class Signature < ActiveRecord::Base belongs_to :card belongs_to :user end class Card < ActiveRecord::Base has_many :signatures has_many :signers,:through => :signatures,:foreign_key => "card_id" end class User < ActiveRecord::Base has_many :sent_cards,:class_name => "Card",:foreign_key => "sender_id" has_many :received_cards,:foreign_key => "recipient_id" has_many :signatures has_many :signed_cards,:foreign_key => "signer_id" end
我使用rails控制台看到以下错误…
ruby-1.9.2-p0 > u15.signed_cards 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? from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/reflection.rb:517:in `check_validity!' from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/associations/association.rb:27:in `initialize' 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' from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/associations.rb:164:in `new' from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.1.0/lib/active_record/associations.rb:164:in `association' 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' from (irb):11 from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.1.0/lib/rails/commands/console.rb:45:in `start' from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.1.0/lib/rails/commands/console.rb:8:in `start' from /home/slabounty/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.1.0/lib/rails/commands.rb:40:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>'
我得到相同的事情,当我添加source => :卡/:用户(应该是:在这种情况下我相信卡).
任何想法我在这里做错什么?
显示部分解决方案,因为我想清理一个
一些事情.迁移与以前的版本保持一致.我现在
看到sql错误(见下文),它在Signature中找不到user_id.一世
讨厌说,但大多数我一直在加入:foreign_key whereever我想
他们可能无济于事.
class Signature < ActiveRecord::Base belongs_to :card belongs_to :signer,:class_name => "User" end class Card < ActiveRecord::Base # Correct has_many :signatures has_many :signers,:source => :user end class User < ActiveRecord::Base # Wrong! has_many :signatures,:foreign_key => "signer_id" has_many :signed_cards,:source => :card end
随着错误(减堆栈跟踪)
ruby-1.9.2-p0 > u15.signed_cards 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 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 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和来源).