首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby on Rails: DRYing,一个重复的代码块,用于初始化一些变量

Ruby on Rails: DRYing,一个重复的代码块,用于初始化一些变量
EN

Stack Overflow用户
提问于 2010-12-09 08:59:22
回答 3查看 839关注 0票数 0

我有一个重复的代码块,它在一堆不同的控制器方法中初始化几个变量。有没有一种方法可以让我用model方法来解决这个问题,而不是在每个控制器方法中重复相同的代码块?

基本上,它是一个社交网站,它会拉出一个用户的好友列表,然后根据用户拥有的权限构建好友桶,这些权限存储在一个友谊模型中。这种对存储桶的重复初始化是我试图使其变得干燥的原因。

通常我会使用模型方法,但在这种情况下,3个独立的变量是基于一个数据库拉动而初始化的,并且这个调用足够频繁,我不想因为命中数据库3次而使其效率不必要地降低。在C语言中,我只使用作为变量传入的指针。

它是这样的:

代码语言:javascript
运行
复制
def example_method
  friendships = @user.friendships
  view_permission_friends = []
  write_permission_friends = []
  message_permission_friends = []
  for friendship in friendships
    if friendship.view_permission then view_permission_friends << friendship.friend_id end
    if friendship.write_permission then write_permission_friends << friendship.friend_id end
    if friendship.message_permission then message_permission_friends << friendship.friend_id end
  end
  #Do something with the 3 initialized arrays here
end
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-09 09:37:12

我考虑了一下,我认为这段代码应该放入你的用户模型中。(或者上面示例中的@user类。)有两个原因:

  1. 它非常特定于用户及其关系,最重要的是,如何在数据库中存储和检索它们。
  2. 您只需编写一次代码:在用户模型中。

依赖于Rails的内部查询缓存的快速而简单的方法如下所示。添加到用户模型中:

代码语言:javascript
运行
复制
def view_permission_friends
  return friendships.select{|f| f.view_permission}
end

(etc.)

然后,您的控制器只需执行以下操作:

代码语言:javascript
运行
复制
@viewers = @user.view_permission_friends
(etc.)

(注意-通过惰性缓存和参数化权限,这里有更多的优化空间和更好的灵活性。)

票数 1
EN

Stack Overflow用户

发布于 2010-12-09 09:04:24

不如..。

代码语言:javascript
运行
复制
rv = {}
%w(view write message).each do |type|
  rv["#{type}_permission_friends"] = @user.friendships.select{|f|f.send(:"#{type}_permission")}.collect(&:friend_id)
end

这为您提供了一个带有键的散列,而不是单个数组,但应该足够了。

票数 0
EN

Stack Overflow用户

发布于 2010-12-09 09:24:12

使用Enumerable#injectEnumerable#find_allObject#instance_variable_set

代码语言:javascript
运行
复制
def example_method
  %w{view write message}.inject({}) do |memo, s|
    friendships = @user.friendships.find_all{ |f| f.send("#{s}_permission") }
    memo["#{s}_permission_friends"] = friendships
  end.each do |key, value|
    instance_variable_set "@#{key}", value
  end

  # now you have 3 arrays:
  # @view_permission_friends, @write_permission_friends and @message_permission_friends
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4393920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档