在 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
,在我看来,遍历@favorites
和recipes
并进行比较或确定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 加载的数组中
如何实现“最喜欢的”按钮功能(如最喜欢的食谱/食物)并显示在另一个片段的另一个列表中
如何在asp.net中实现将sqlserver数据库表的数据导入到excel中,希望在代码中生成Excel表并带有中文表头?