Следуйте логике пользователя - PullRequest
0 голосов
/ 29 июля 2010

Я работаю над Ruby на рельсах 2.3.8, и я хотел бы создать функциональность, чтобы следить за пользователями.

Для этой цели я создал 2 таблицы: users и следующих , с их соответствующими моделями:

class User < ActiveRecord::Base
  has_and_belongs_to_many :followings, :foreign_key => "follower_id"
end

class Following < ActiveRecord::Base
  has_and_belongs_to_many :users, :foreign_key => "follower_id", :class_name => "User"
end

Теперь, когда я пытаюсь выполнить current_user.followings.all (с допустимым current_user, конечно), он выдает мне следующееисключение:

'followings_users' doesn't exist: SELECT 'followings'.* FROM `followings`  INNER JOIN 'followings_users' ON 'followings'.id = 'followings_users'.following_id WHERE ('followings_users'.follower_id = 1 )

Я не могу сделать эту работу.Я не знаю, почему он запрашивает у меня таблицу "followings_users".Что если я захочу назвать это просто «подписками»?

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 29 июля 2010

Вы также можете сделать это с использованием более нового синтаксиса has_many :through:

class User < ActiveRecord::Base
  has_many :user_followings
  has_many :followings, :through => :user_followings
end

class UserFollowing < ActiveRecord::Base
  belongs_to :users
  belongs_to :followings
end

class Following < ActiveRecord::Base
end

Для этого требуется таблица соединения с именем :user_followings со столбцами user_id и following_id.

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

1 голос
/ 29 июля 2010

При использовании habtm Rails будет пытаться получить ассоциации из таблицы соединений. Он пытается угадать имя таблицы, объединяя два имени (followings_users), или вы можете указать имя таблицы в качестве опции. Но вы должны явно создать эту таблицу в своих миграциях.

См. Документацию здесь

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