2009-09-04 12 views
0

je ne peux pas sembler comprendre pourquoi cette association ne fonctionne pas: Je ne sais pas comment décrire la situation mieux que de fournir un exemple de code:Accès à un modèle associé de belongs_to via has_one: par

ici est mon environnement d'application:

Ruby version    1.8.7 (universal-darwin10.0) 
Rails version    2.3.3 

Et un exemple de code:

class Account 
has_one :subscription 
has_one :package, :through => :subscription 
end 

class Subscription 
belongs_to :account 
belongs_to :package 
end 

class Package 
has_many :subscriptions 
has_many :accounts, :through => :subscriptions 
end 

>> Account.first.subscription 
=> #<Subscription id: 1, account_id: 25, package_id: 4> 

>> Account.first.subscription.package 
=> #<Package id: 4, name: "Bronze Package"> 

>> Package.first.accounts 
=> [#<Account id: 25, subdomain: "bigbangtechnology">] 

>> Package.first.subscriptions 
=> [#<Subscription id: 1, account_id: 25, package_id: 4>] 

>> Account.first.package 
    Package Load (0.0ms) Mysql::Error: Unknown column 'packages.account_id' in 'where clause': SELECT `packages`.* FROM `packages` WHERE (packages.account_id = 25) 
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'packages.account_id' in 'where clause': SELECT `packages`.* FROM `packages` WHERE (packages.account_id = 25) 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:212:in `log' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:320:in `execute' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:595:in `select' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in `select_all_without_query_cache' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:62:in `select_all' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/base.rb:661:in `find_by_sql' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/base.rb:1548:in `find_every' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/base.rb:615:in `find' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb:73:in `find_target' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/associations/has_one_through_association.rb:23:in `find_target' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:353:in `load_target' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:112:in `reload' 
from /Users/camwest/Sites/yardstickapp/vendor/rails/activerecord/lib/active_record/associations.rb:1219:in `package' 
from (irb):22 

Répondre

0

On dirait que j'ai trouvé ma réponse en lisant la documentation:

: par

Spécifie une jointure modèle à travers lequel pour exécuter la requête. Les options pour: class_name et: foreign_key sont ignorées, car l'association utilise la réflexion de la source. Vous pouvez uniquement utiliser une requête: through via une association has_one ou belongs_to sur le modèle de jointure. Ce que cela me dit est que vous ne pouvez pas utiliser: through sur has_one sur autre chose que le modèle Subscription (mon modèle de jointure). Suce! Si quelqu'un a d'autres réponses, ce serait génial.

+0

compte de la classe; paquet def; abonnement.package si abonnement; fin; fin – klochner

Questions connexes