Рубин ActiveRecord 2 уровня присоединения - PullRequest
1 голос
/ 08 марта 2012

Это должен быть очень простой вопрос, я все еще новичок в ruby, поэтому буду признателен за помощь.

Итак, у меня есть 3 таблицы в моей базе данных: Source, SourceType и Feed. Каждый источник принадлежит к SourceType, а каждый канал принадлежит источнику. Их первичными ключами являются SourceID, TypeID и FeedID

Мои классы активной записи:

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 из 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? Ошибка

Если я удаляю его из Joins, я получаю ошибку Unknown column 'SourceType.Name' in 'field list'.

Какой правильный способ сделать это?

Спасибо

PS: Моя база данных не соответствует соглашениям об именах активных записей, но я не могу изменить то, что я работаю с существующей БД.

Ответы [ 2 ]

6 голосов
/ 08 марта 2012

Попробуйте изменить аргументы объединения с

.joins(:Source, :SourceType)

до

.joins(:Source => :SourceType)

Кроме того, следует отметить, что имена ваших ассоциаций, вероятно, должны быть прописными в определениях вашей модели.

1 голос
/ 08 марта 2012

Ваш запрос работает, только если в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...