Соединение таблиц в Rails через таблицу отношений - PullRequest
0 голосов
/ 30 ноября 2010

у меня три класса;Пользователь, Лента и Записи.У пользователей есть один или несколько каналов, а в каналах есть одна или несколько записей:

class Feed < ActiveRecord::Base
  has_many :entries
  has_many :feeds_users
  has_many :users, :through => :feeds_users, :class_name => "User"
end

Class User < ActiveRecord::Base
  has_many :feeds_users
  has_many :feeds, :through => :feeds_users, :class_name => "Feed"
end

class Entry < ActiveRecord:Base
  belongs_to :feed
end

Классы пользователей и каналов связаны с третьей таблицей:

class FeedsUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :feed
end

Теперь моя проблема в том, чтоМне нужно получить фиды определенного пользователя и последние n записей каждого фида.Я возиться с чем-то вроде этого:

u = User.first
Feed.joins(:entries, :users).where(:entries => { :created_at => (Time.now-2.days)..Time.now }, :users => u)

Моя проблема здесь заключается в том, что это генерирует некоторый SQL, который пытается запросить «пользователей» в таблице «фиды» - которых не существует.

Как мне создать правильный запрос, который может дать мне все фиды и их последние 10 записей для данного пользователя?

1 Ответ

1 голос
/ 30 ноября 2010

вывезти has_many :feeds_users.:feeds_users не должно быть моделью.

Вы должны держать стол, но некоторая магия Rails продолжается за кулисами.Если у вас есть таблица с именем feeds и таблица с именем users, Rails получает имя таблицы для поиска, если вы не укажете ее по-другому.

Для вашего примера:

Class Feed < ActiveRecord::Base
  has_many :users
end

Class User < ActiveRecord::Base
  has_many :feeds
end

Это будетищите отношения в таблице users_feeds.Если бы это выглядело так:

Class Feed < ActiveRecord::Base
  belongs_to :user
end

Class User < ActiveRecord::Base
  has_many :feeds
end

Было бы искать отношения в таблице user_feeds.

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

Звучит так, как будто вам нужно отношение has_and_belongs_to_many вместо просто has_many.

Для полного разгонаВсе формы модельных ассоциаций, см. Руководство .

...