Ruby ActiveRecord 2级联接

app*_*ief 1 ruby activerecord ruby-on-rails

这应该是一个非常基本的问题,我仍然是ruby的新手,所以我会感激一些帮助.

所以我的db,Source,SourceType和Feed中有3个表.每个Source都属于SourceType,而每个Feed都属于Source.它们的主键是SourceID,TypeID和FeedID

我的Active Record Classes是:

class SourceFeed < ActiveRecord::Base
  self.table_name = "SourceFeed"
  self.primary_key = "FeedID"

  belongs_to :Source, 
  :foreign_key => "SourceID", 
  :class_name => "Source",
  :include => "SourceType"
end

class Source < ActiveRecord::Base
  self.table_name = "Source"
  self.primary_key = "SourceID"

  has_many :SourceFeeds, 
  :primary_key => "SourceID", 
  :class_name => "SourceFeed"

  belongs_to :SourceType,
  :foreign_key => "TypeID", 
  :class_name => "SourceType"
end

class SourceType < ActiveRecord::Base
  self.table_name = "SourceType"
  self.primary_key = "TypeID"

  has_many :Source, 
  :primary_key => "TypeID", 
  :class_name => "Source"
end
Run Code Online (Sandbox Code Playgroud)

我试图从SourceFeed,Stuff from Source和SourceType中选择东西.这是查询:

feed = SourceFeed.select("SourceFeed.FeedID, Source.Name as SourceName, SourceType.Name as SourceType").joins(:Source, :SourceType).where(:FeedID => FeedID).first
Run Code Online (Sandbox Code Playgroud)

我收到了Association named 'SourceType' was not found; perhaps you misspelled it?错误

如果我从联接中删除它,我收到一个Unknown column 'SourceType.Name' in 'field list'错误.

什么是正确的方法呢?

谢谢

PS:我的数据库不遵循活动记录命名约定,但我不能改变我正在使用现有数据库.

Der*_*mel 6

尝试更改连接参数

.joins(:Source, :SourceType)
Run Code Online (Sandbox Code Playgroud)

.joins(:Source => :SourceType)
Run Code Online (Sandbox Code Playgroud)

此外,应该提到的是,您的关联名称应该在您的模型定义中小写.