用户在Ruby on Rails中标记(喜欢的)另一个模型

时间:2014-06-19 11:32:43

标签: ruby-on-rails ruby favorites

我想在Ruby on Rails应用程序中实现“Read Later”(就像收藏夹)系统。我想要的是User模型能够标记Content模型以便稍后阅读。

我在两个模型之间的关联是这样的:

class User < ActiveRecord::Base
    has_many :contents
end

-------------

class Content < ActiveRecord::Base
    belongs_to :user
end

然后内容属于Category等,但这对问题无关紧要,所以我没有把它放在那里。

User可以标记Content(可能属于另一个用户),并且每个用户都会有一个“标记内容(稍后阅读)”的列表。

我怎么能实现这个?

我已经阅读了this个问题,但我并不理解,在尝试模拟它时,它无效。

1 个答案:

答案 0 :(得分:2)

你尝试了什么,什么不起作用?

这很简单。让我们思考:

有一位用户:

class User < ActiveRecord::Base
end

有内容:

class Content < ActiveRecord::Base
end

用户可以创建内容,是否仅限于创建一个内容?没有。用户可以根据需要创建任意数量的内容。这就是在Rails术语中用户has_many的内容。换句话说,我们可以说内容是由用户创建的。

class User < ActiveRecord::Base
  has_many :contents
end

class Content < ActiveRecored::Base
  belongs_to :user
end

现在,内容(通常由其他用户创建)可以被其他用户收藏(标记为“稍后读取”)。每个用户都可以按照自己的意愿收藏(标记为“稍后阅读”)尽可能多的内容,并且每个内容都可以被许多用户收藏不是吗?但是,我们必须跟踪哪个用户在哪个地方收藏了哪些内容。最简单的方法是定义另一个模型,让我们说MarkedContent来保存这些信息。 has_many:through关联通常用于与另一个模型建立多对多连接。因此相关的协会声明可能如下所示:

class User < ActiveRecord::Base
  has_many :contents

  has_many :marked_contents
  has_many :markings, through: :marked_contents, source: :content
end

class MarkedContent < ActiveRecord::Base
  belongs_to :user
  belongs_to :content
end

class Content < ActiveRecord::Base
  belongs_to :user

  has_many :marked_contents
  has_many :marked_by, through: :marked_contents, source: :user
end

现在你可以做到:

user.contents # to get all the content created by this user
user.marked_contents # to get all the contents marked as 'Read Later' by this user

content.user # to get the creator of this content
content.marked_by # to get all the users who have marked this content

阅读更多here以了解关联。

要将内容标记为收藏,一种方法是:

@user = User.first
@content = Content.last

@user.markings << @content 

您还可以在User模型中实现一个方法来为您执行此操作:

class User < ActiveRecord::Base
  ...
  def read_later(content)
    markings << content
  end
end

现在,你可以这样做:

@user.read_later(@content)