我的主要模特是我有用户,我有食谱。
我正在尝试实现标记结构,以便每个用户都可以使用单个标记标记配方。因此,在查看食谱时,他们只会看到自己添加的标签。
我创建了两个模型主题标签,并且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
这对于创建哈希标记很有用,但是我对如何合并它的用户方面感到茫然。如何在分配标签的同时将当前用户分配给这些标签,然后返回这些标签?
答案 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
因为我假设您不想要重复的主题标签或重复的哈希标记。你也可以创建。current_user
方法,或者通过像Devise这样的宝石。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
的控制器,具体取决于您如何定义资源。如果您愿意,可以随时覆盖它。