2012-03-08 31 views
1

这应该是一个非常基本的问题,我对ruby还是个新手,所以我会感谢一些帮助。Ruby ActiveRecord 2级别加入

所以我有3个表在我的数据库,源,SourceType和饲料。每个源都属于一个SourceType,每个源都属于一个源。他们的主键的SourceID,TYPEID和FeedID

我的Active Record类是:

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,东西从来源和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:我的数据库不遵循活动记录的命名约定,但我无法改变,我与现有的DB工作。

回答

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 

UPDATE: 当然,德里克哈尔迈勒的答案是一个更好的。尽可能避免SQL。

+0

它的工作感谢:)第二个连接应该读'连接(“JOIN源类型在SourceType.TypeID = Source.TypeID”)' – applechief 2012-03-08 14:54:32

5

尝试改变加入参数从

.joins(:Source, :SourceType) 

.joins(:Source => :SourceType) 

而且,应该提到的是你的名字协会应该大概是在你的模型定义被小写。

+0

这也工作。谢谢。低层次只是一个惯例还是会影响某些东西? – applechief 2012-03-08 14:57:31

+1

公约是肯定的,但也可能有一些后果,但我不能肯定地说。通常Ruby会保留常量,类和模块的大小写。你最终会看到一些有趣的代码,例如source.SourceType绝对不是惯用的。 – 2012-03-08 15:06:14

+0

这就是答案!谢谢德里克! – andy 2013-05-13 06:35:05