这应该是一个非常基本的问题,我对红宝石来说还是新手,所以我很感激一些帮助。
所以我的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:我的数据库没有遵循活动记录命名约定,但我无法改变我正在使用现有数据库。
答案 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。