Gri*_*sha 6 ruby-on-rails model-associations ruby-on-rails-3
我有两张桌子:
货币和利率
currencies: id:int, code:string, name: string
rates: id:int, top_currency_id:int, bottom_currency_id:int, rate:float
我有两个活跃的记录:
class Rate < ActiveRecord::Base
  attr_accessible :bottom_currency, :rate, :top_currency, :top_currency_id
  belongs_to :top_currency, :class_name => 'Currency', :foreign_key => 'top_currency_id'
  belongs_to :bottom_currency, :class_name => 'Currency', :foreign_key => 'bottom_currency_id'
end
class Currency < ActiveRecord::Base
  attr_accessible :code, :name
  has_many :rates
end
所以问题是:当我要执行以下代码时:top_currency = Currency.find_by_id(1)@test = Rate.where(:top_currency => top_currency)
我收到以下错误:
Mysql2::Error: Unknown column 'rates.top_currency' in 
'where clause': SELECT `rates`.* FROM `rates`  WHERE `rates`.`top_currency` = 1
为什么Rails的魔法不起作用?
非常感谢.
据我所知,您的代码理论上应该可以工作。但我确实认为你有点多余。
这样做就足够了:
class Rate < ActiveRecord::Base
  belongs_to :top_currency, class_name: 'Currency'
  belongs_to :bottom_currency, class_name: 'Currency'
end
Rails会推断为外键top_currency是top_currency_id,和bottom_currency_id为bottom_currency。
在您的两种belongs_to方法中,将foreign_key选项更改为primary_key,将其他所有内容保留为原样.  
belongs_to :top_currency, :class_name => 'Currency', :primary_key => 'top_currency_id'
# ...
默认情况下,关联对象的主键是id.但是,您的货币模型有三个主键,预期id加上两个额外的键:top_currency_id和bottom_currency_id.Active Record需要知道要查找的密钥.用primary_key选项告诉它.  
foreign_key当外键不同于关联的名称(belongs_to :name)加上" _id" 时,需要该选项.由于您的外键与关联名称加上" _id," 匹配,因此您无需使用该foreign_key选项.  
| 归档时间: | 
 | 
| 查看次数: | 8386 次 | 
| 最近记录: |