2011-03-13 8 views
2

J'essaye de plier des rails autour d'une base de données héritée. Chacune des tables a une colonne 'datasource' qui est un code à 3 caractères d'où proviennent les données. Ainsi, afin d'identifier et de vous identifier de manière unique aux autres tables, vous devez avoir deux informations (par exemple, numéro de compte et source de données).Rails has_many association avec plusieurs clés

La relation has_many que j'ai ci-dessous fonctionne bien, sauf si j'essaie d'inclure dans une requête.

# Model Association 
has_many :transactions, 
     :primary_key => :account, 
     :foreign_key => :acnt, 
     :order => :ddate, 
     :conditions => ['datasource = ?', '#{self.datasource}'] 

# Controller code FAIL when I loop through results in view and call 'account.transactions' 
@accounts = Account.includes(:transactions).where(:lname => 'Smith') 

# However, this controller code works when I loop through the results in the view and call 'account.transactions' 
@accounts = Account.where(:lname => 'Smith') 

# View 
<% @accounts.each do |a| %> 
    <% a.transactions.each do |t| %> 
    <%= t.description %> 
    <% end %> 
<% end %> 

Erreur:

ActionView::Template::Error (undefined method `datasource' for #<Class:0x1025f25c8>): 

Quelle est la bonne façon d'y arriver dans Rails 3?

+0

montrer votre erreur – fl00r

Répondre

0

La déclaration de votre état est erronée. Essaye ça.

:conditions => ['transactions.datasource = accounts.datasource']

+0

lors de l'utilisation has_many table de « comptes » est pas dans la FROM donc cette condition est invalide. – robotshapes

1

Essayez de mettre votre état à l'intérieur des citations

has_many :transactions, 
     :primary_key => :account, 
     :foreign_key => :acnt, 
     :order => :ddate, 
     :conditions => ['datasource = "#{self.datasource}"'] 
+0

self.datasource génère une erreur car dataource n'est pas un attribut de classe. self fait référence à la classe Account ici pas à l'instance. –

+0

vous avez tort, car 'self' est l'objet parent (transaction.account) (instance). – fl00r

+0

cela n'a pas fonctionné pour moi. – robotshapes

2

craqua et personnalisé le finder_sql. On dirait que ça marche, jusqu'à présent ...

has_many :transactions, 
      :primary_key => :account, 
      :foreign_key => :acnt, 
      :finder_sql => 
       'SELECT t.* ' + 
       'FROM accounts a, transactions t ' + 
       'WHERE a.acnt = t.account AND a.datasource = t.datasource ' + 
       'ORDER BY t.ddate' 
+0

très bonne question :) aux favoris – fl00r

Questions connexes