每个用户每个帖子的标签,未列出用户。

时间:2016-05-23 18:38:42

标签: ruby-on-rails

我的主要模特是我有用户,我有食谱。

我正在尝试实现标记结构,以便每个用户都可以使用单个标记标记配方。因此,在查看食谱时,他们只会看到自己添加的标签。

我创建了两个模型主题标签,并且hashtagging是连接表。设置如下:

模型/ hashtags.rb

class Hashtag < ActiveRecord::Base
  has_many :hashtaggings
  has_many :recipes, through: :hashtaggings
  has_many :users, through: :hashtaggings
end

模型/ hashtagging.rb

class Hashtagging < ActiveRecord::Base
  belongs_to :user
  belongs_to :hashtag
  belongs_to :recipe
end

模型/ recipe.rb

class Recipe < ActiveRecord::Base
    ...
    has_and_belongs_to_many :users
    has_many :hashtaggings
    has_many :hashtags, through: :hashtaggings
    ....
    def all_hashtags=(name)
      self.hashtags = name.split(",").map do |name|
        Hashtag.where(name: name.strip).first_or_create!
      end
    end

    def all_hashtags
      self.hashtags.map(&:name).join(",")
    end
end

class User < ActiveRecord::Base
  ...
  has_many :hashtaggings
  has_many :hashtags, through: :hashtaggings
  ...
end

这对于创建哈希标记很有用,但是我对如何合并它的用户方面感到茫然。如何在分配标签的同时将当前用户分配给这些标签,然后返回这些标签?

1 个答案:

答案 0 :(得分:0)

有两个步骤,创建和显示......

<强>创作

这个会很棘手,因为你不能简单地做一些像......

@recipe.hashtags.create(name: "Tasty as heck!")

...因为配方和标签都不知道用户的任何信息。这是一个两步的过程。

class RecipeHashtagsController
   def create
      current_hashtag = Hashtag.find_or_create_by(name: "Scrumptious!")
      current_recipe = Recipe.find(params[:recipe_id])
      hashtagging = Hashtagging.find_or_create_by(hashtag: current_hashtag, user: current_user, recipe: current_recipe)
      # redirect_to somewhere_else...
   end
end

我在那里做过的一些事情:

  • 我正在使用find_or_create_by因为我假设您不想要重复的主题标签或重复的哈希标记。你也可以创建。
  • 我假设您在ApplicationController中使用某种current_user方法,或者通过像Devise这样的宝石。
  • 我假设你有一个像RecipeHashtags这样的控制器,并且nested resource匹配并且会从路线中提供id。我建议在这里嵌套,因为你不是简单地创建一个hashtag,而是在一个配方的特定上下文中创建一个hashtag。

<强>显示

这很棘手,因为你想显示recipe.hashtags但是在连接表hashtaggings上有一个条件。这不是直截了当的。

我在想的是你可能希望能够做一些像......

@recipe.hashtags_for_user(current_user)

...可以采用Recipe上的方法形式。

class Recipe

  def hashtags_for_user(user)
    Hashtags.joins(:hashtaggings).where(hashtaggings: { user_id: user.id, recipe_id: self.id })
  end

end

您可以在the Active Record Querying Rails Guide中详细了解.where来电中的哈希值(请参阅第12.3节)。

编辑:控制器

我建议将RecipeHashtags创建为指向独立控制器的嵌套路由,因为创建主题标签取决于为其创建的配方。

<强>的routes.rb

resources :recipes do
  resources :hashtags, only: [:create]
end

...当你在终端中rake routes时会显示如下内容......

POST /recipes/:recipe_id/hashtags(.:format) recipe_hashtags#create

注意:我假设您拥有recipes资源的资源。如果不这样做,这可能会复制某些路线并产生其他意外结果。

Rails的默认行为是假设您有一个类似于recipe_hashtags_controller的控制器,具体取决于您如何定义资源。如果您愿意,可以随时覆盖它。