在 Rails 中实现将食谱添加到收藏夹并查找当前用户是不是有 'favorite_set?'一个食谱

Posted

技术标签:

【中文标题】在 Rails 中实现将食谱添加到收藏夹并查找当前用户是不是有 \'favorite_set?\'一个食谱【英文标题】:Implement add Recipe to favorites in Rails and find if current user has 'favorite_set?' a recipe在 Rails 中实现将食谱添加到收藏夹并查找当前用户是否有 'favorite_set?'一个食谱 【发布时间】:2016-02-19 08:39:14 【问题描述】:

这个问题与to 相关,它显示了一个has_many :through 关联。如答案所示,我有类似的关联。我会引用以供参考。

$ rails g model FavoriteRecipe recipe_id:integer user_id:integer

# Join model connecting user and favorites
class FavoriteRecipe < ActiveRecord::Base
  belongs_to :recipe
  belongs_to :user
end

---

class User < ActiveRecord::Base
  has_many :recipes

  # Favorite recipes of user
  has_many :favorite_recipes # just the 'relationships'
  has_many :favorites, through: :favorite_recipes, source: :recipe # the actual recipes a user favorites
end

class Recipe < ActiveRecord::Base
  belongs_to :user

  # Favorited by users
  has_many :favorite_recipes # just the 'relationships'
  has_many :favorited_by, through: :favorite_recipes, source: :user # the actual users favoriting a recipe
end

我很想知道这个解决方案是否适用于与加入模型的多对多关系,例如FavoriteRecipe 具有布尔属性 favorite_set。在遍历Recipes 时,我想知道当前用户是否“收藏”了这个/这些Recipes。像current_user.recipe.favorite_set? 这样的东西,但当然要通过FavoriteRecipe 加入模型。如果true 显示'FAVORITE SET',否则请选择收藏此recipe。我的实现是一个显示所有“食谱”并显示“FAVORITE SET”或提供“收藏”一个或多个Recipes 的选项的提要。

提前致谢。

【问题讨论】:

是的,您可以将属性添加到FavoriteRecipe - 它只是一个模型。但我不认为你想通过添加某种布尔值来使事情复杂化,因为你可以使用计数查询来做到这一点。要检查用户是否有任何收藏,您可以通过user.favorite_recipes.any? 检查他是否收藏了特定食谱,最简单的方法是:FavoriteRecipe.where(user: user, recipe: recipe).any?user.favorite_recipes.where(recipe: recipe).any? @max 感谢您的建议。我认为这可行。在控制器中,我可以获得当前用户@favorites= current_user.favorite_recipes.any?@recipes = FavoriteRecipe.all,在我看来,遍历@favoritesrecipes 并进行比较或确定current_user 是否“收藏”了这个recipe。我认为在我看来,在each 循环中执行其他查询的成本很高。这有点接近你的建议吗? 【参考方案1】:

为了解决这个问题,我在 app/helpers 中创建了一个帮助模块

module ReminderHelper
  #Check if user has set reminder for a specific event
  def event_reminder_set? user, event
    EventReminder.where(user: user, event: event).any?
  end 
end

我将模块包含在app/controllers/application_controller.rb

include ReminderHelper

在我看来,我使用它如下

<% unless event_reminder_set?(current_or_guest_user, event) %>
    REMIND ME
<% else %>
    REMINDER SET
<% end %>

这应该适用于与加入模型具有多对多关系的其他模型关联,例如FavoriteRecipe

【讨论】:

应该像user.event_reminders.where(event: event).any?。 Helper 用于简化视图。您不必将其包含在控制器中。谢谢

以上是关于在 Rails 中实现将食谱添加到收藏夹并查找当前用户是不是有 'favorite_set?'一个食谱的主要内容,如果未能解决你的问题,请参考以下文章

禁用添加对象的选项,该对象已经在从 NSUserDefaults 加载的数组中

如何在mysql中实现将当前的时间作为建表时的表名

在 Rails 中实现“查找商店”功能的最佳方式是啥?

Rails中的全局实例变量

如何实现“最喜欢的”按钮功能(如最喜欢的食谱/食物)并显示在另一个片段的另一个列表中

如何在asp.net中实现将sqlserver数据库表的数据导入到excel中,希望在代码中生成Excel表并带有中文表头?