Имеет много ассоциаций с тегами сообщений для конкретных пользователей.

Я довольно новичок в Rails, и отношения «многие ко многим» немного выше моего понимания. В моем приложении User их много, и они могут видеть Posts других. Они могут классифицировать сообщения для себя, добавляя Tag — только один к сообщению. Другие пользователи могут пометить ту же публикацию другим тегом, и он будет отображаться только для них.

Как я могу сделать это отношение в Rails?

class User < ActiveRecord::Base
   has_many :tags

class Post < ActiveRecord::Base
   has_one :tag, :through => :user # correct?

class Tag < ActiveRecord::Base
   belongs_to :user
   has_many :posts

person bushytop    schedule 08.11.2013    source источник


Ответы (2)


Вы можете написать это таким образом

class User < ActiveRecord::Base
  has_many :tags
  has_many :posts, through: :tags

class Post < ActiveRecord::Base
  has_many :tags

class Tag < ActiveRecord::Base
  belongs_to :user
  belongs_to :post

Таким образом, у каждого поста будет много тегов, но только по 1 для каждого пользователя. Кстати, вы можете добавить еще 1 модель для хранения тегов тегов и тегов пользователей отдельно.

class User < ActiveRecord::Base
  has_many :user_tags
  has_many :tags, through: :user_tags
  has_many :posts, through: :user_tags

class Post < ActiveRecord::Base
  has_many :user_tags

class Tag < ActiveRecord::Base
  has_many :user_tags

class UserTags < ActiveRecord::Base
  belongs_to :user
  belongs_to :tag
  belongs_to :post
person vld    schedule 09.11.2013
comment
В чем преимущество модели user_tags? - person bushytop; 09.11.2013
comment
Держите теги уникальными. Например, если user1 и user2 пометили post1 тегом ruby, в первом случае это будет 2 тега ruby ​​с разными пользователями для belnongs. Во втором случае у вас может быть 1 Tag ruby. - person vld; 09.11.2013

Если я вас правильно понял, я думаю, вы хотите, чтобы это было так:

class User < ActiveRecord::Base
   has_many :tags

class Post < ActiveRecord::Base
   has_many :tags, :through => :user

class Tag < ActiveRecord::Base
   belongs_to :user
   has_many :posts

Обратите внимание, что сообщение имеет_много тегов.

Если вас беспокоит:

Другие пользователи могут пометить ту же публикацию другим тегом, и он будет отображаться только для них.

Это просто прекрасно. Вы сможете это сделать, поскольку тег, связанный с публикацией, принадлежит пользователю, поэтому вы всегда можете сделать что-то вроде...

@post.tags.each do |tag|
  if tag.user == current_user
   # show tag.
  end
end
person Nobita    schedule 09.11.2013