2016-02-24 4 views
0

Предположим, у меня есть модель User, и я хотел бы позволить каждому пользователю выбирать своих «лучших друзей», которые также являются пользователями, в порядке предпочтения. Таким образом, пользователь может иметь «лучшего друга» и «третьего лучшего друга» и так далее. Я думаю, что я ищу (поправьте меня, если это плохой путь, чтобы спуститься) - это habtm в модели User, с добавленным размером заказа к ним.В Rails Как разрешить пользователям создавать упорядоченный список других пользователей?

Конечной целью является, чтобы позволить мне сделать что-то вроде:

@user.favorite_users => упорядоченный список своих любимых пользователей.

@user.favorite_users.each do |user| //iterate through each user in order from best friend to worst friend end

Я использую Ruby, 2.3.0, Rails 4.2.

+0

Вы могли бы быть заинтересованы в Деяниях виде списка драгоценных камней (https://github.com/swanandp/acts_as_list). Позволяет легко реализовать. Я не использовал это для отношений «многие-ко-многим», но я бы предположил, что вам лучше всего использовать отношения «has_many through» и «здесь». Надеюсь, это поможет! – SRack

+0

вам нужно использовать 'has_many, хотя:' not habtm, так как он не позволяет хранить дополнительные данные в таблице соединений. Добавление «фаворитности» к таблице соединений тривиально, но создание многих для многих в одну и ту же таблицу довольно сложно. http://stackoverflow.com/questions/2168442/many-to-many-relationship-with-the-same-model-in-rails – max

ответ

1

Попробуйте следующее:

class User < ActiveRecord::Base 
    has_many :friendships 
    has_many :friends, -> { order 'friendships.order ASC'}, through: :friendships 
end 

class Friendship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, class_name: 'User' 
end 

@user.friends даст вам список пользователей, заказанных order в friendships

+0

Это просто и эффективно - тогда таблица дружеских отношений имеет порядок: integer friend_id: integer user_id: целое число и индексы на user_id и friend_id. Заказ можно легко заметить и изменить с помощью user.friendships. (...) Он работает для меня. –

Смежные вопросы