Ruby ActiveRecord 2级联接

时间:2012-03-08 14:31:33

标签: ruby-on-rails ruby activerecord

这应该是一个非常基本的问题,我对红宝石来说还是新手,所以我很感激一些帮助。

所以我的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

我正在尝试从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

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

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

做正确的方法是什么?

由于

PS:我的数据库没有遵循活动记录命名约定,但我无法改变我正在使用现有数据库。

2 个答案:

答案 0 :(得分:6)

尝试从

更改连接参数
.joins(:Source, :SourceType)

.joins(:Source => :SourceType)

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

答案 1 :(得分:1)

只有在SourceFeed中定义了名为“SourceType”的关联时,您的查询才有效。你没有它,所以你得到了错误。 我认为这应该有效:

feed = SourceFeed.select("SourceFeed.FeedID, Source.Name as SourceName, SourceType.Name as SourceType").joins(:Source).joins("JOIN SourceType ON SourceType.TypeID = Source.TypeID").where(:FeedID => FeedID).first

<强>更新: 当然,Derek Harmel的答案更好。应尽可能避免使用SQL。