小编Max*_*yak的帖子

在计划中建模无限期重复任务(类似日历的rails应用程序)

这是一个相当绊脚石.警告:以下不是问题,而是对我提出的问题的解释.我的问题是 - 你有更好的方法吗?是否有一些我不熟悉的常用技巧?似乎这是一个微不足道的问题.

所以你有任务模型.您可以创建任务,完成任务,销毁它们.然后你有重复的任务.它就像常规任务一样,但它附有一个重复规则.但是,任务可以无限期地重现 - 您可以在计划中提前一年,并且您应该看到任务显示.

因此,当用户创建一个定期任务时,您不希望在未来一百年内构建数千个任务,并将它们保存到数据库中,对吗?所以我开始思考 - 你是如何创造它们的?

一种方法是在查看日程安排时创建它们.因此,当用户提前一个月移动时,将创建任何重复任务.当然,这意味着您不能再简单地处理任务的数据库记录.您执行的任务上的每个SELECT操作都必须位于特定日期范围的上下文中,以便触发该日期范围内的重复任务.这是一种维护和性能负担,但可行.

好吧,但原来的任务怎么样?每个周期性任务都与创建它的重复规则相关联,并且每个重复规则都需要知道开始重复的原始任务.后者很重要,因为当用户浏览他们的日程安排时,您需要将原始任务克隆到新日期.我猜也是可行的.

但如果原始任务更新会发生什么?这意味着现在,当我们浏览计划时,我们将创建从修改的任务克隆的重复任务.那是不可取的.所有隐式持久的重复任务都应该显示添加重复时原始任务的样子.因此,我们需要单独存储原始任务的副本,并从中进行克隆,以便重现工作.

但是,当用户在计划中导航任务时,我们如何知道在特定点是否需要创建新的重复任务?我们问复发规则:"嘿,我今天应该继续执行任务吗?" 它说是或否.如果今天已经有这个重复的任务,我们不会创建一个.一切都很好,除了用户还应该能够简单地删除一个自动持久的重复任务.在这种情况下遵循我们的逻辑,系统将重新创建已删除的任务.不好.因此,这意味着我们需要继续存储任务,但将此标记为已删除的任务以进行此重复.咩.

正如我在开始时所说,我想知道其他人是否解决了这个问题并且可以在这里提供建筑建议.它必须是这个混乱吗?还有什么比我更缺的优雅吗?

更新:由于这个问题难以完美回答,我将批准对设计/架构最有帮助的见解,这对于此类问题具有最佳的帮助/权衡比率.它不必包含所有细节.

ruby architecture database-design ruby-on-rails

11
推荐指数
1
解决办法
3230
查看次数

在 Golang 中,消费者如何为接受接口的函数定义接口?

如果我正确理解 Go 实践,调用者(又名消费者)应该从其依赖项(又名生产者)定义他们想要使用的接口。

\n

但是,如果生产者有一个接受自定义类型的函数,那么最好让它接受一个接口,对吗?这样消费者就可以传递一些符合生产者接口的值,而无需知道确切的类型。因为生产者函数的输入值使生产者成为该输入值的“消费者”。

\n

好吧,很公平。

\n

问题是,消费者如何定义一个接口,其中包含一个函数,其参数是生产者中定义的接口?

\n

试图让问题更清楚

\n

假设我有一个名为chefstruct 的包Chef。它有一个方法Cut(fruit) error,并且fruit是我的包中定义的接口chef

\n

现在假设我在调用代码中,并且导入了 package chef。我想给它一个水果来切,但就我而言,我实现了一个名为 的特定水果Apple。当然,我会尝试为自己构建这个界面:

\n
type myRequirements interface {\n  Cut(Apple) error\n}\n
Run Code Online (Sandbox Code Playgroud)\n

fruit因为我有接口的具体实现称为Apple,所以我想表明我的接口仅适用于苹果。

\n

但是,如果我尝试Chef{}针对我的接口使用,Go 将抛出编译错误,因为我的接口想要Cut(Apple)并且Chef{}想要Cut(Fruit)。尽管苹果实现了这一点fruit

\n

看来,避免这种情况的唯一方法是创建chef.Fruit一个公共接口,并在我自己的接口中使用它。

\n
type myRequirements interface {\n  Cut(chef.Fruit) error\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但这完全破坏了我chef在接口下插入不同实现(而不是 )的能力,因为现在我与chef.

\n

所以Chef有一个内部接口 …

go go-interface

10
推荐指数
1
解决办法
2616
查看次数

在Rails中使用accepts_nested_attributes_for +质量分配保护

假设你有这个结构:

class House < ActiveRecord::Base
  has_many :rooms
  accepts_nested_attributes_for :rooms
  attr_accessible :rooms_attributes
end

class Room < ActiveRecord::Base 
  has_one :tv
  accepts_nested_attributes_for :tv
  attr_accessible :tv_attributes
end

class Tv 
  belongs_to :user
  attr_accessible :manufacturer
  validates_presence_of :user
end
Run Code Online (Sandbox Code Playgroud)

请注意,Tv的用户无法故意访问.所以你有一个三层嵌套的表格,允许你在一个页面上输入房子,房间和电视.

这是控制器的创建方法:

def create
  @house = House.new(params[:house])

  if @house.save
    # ... standard stuff
  else
    # ... standard stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

问题:你将如何填充user_id每个电视(它应该来自current_user.id)?什么是好的做法?

这是我在这看到的catch22.

  1. user_ids直接填充params哈希(它们非常嵌套)
    • 保存将失败,因为user_ids不可批量分配
  2. 在#save完成后为每个电视填充用户
    • 保存将失败,因为user_id必须存在
    • 即使我们绕过上述情况,电视也会暂时没有ids - 很糟糕

有任何体面的方式吗?

ruby ruby-on-rails nested-forms mass-assignment

6
推荐指数
1
解决办法
4515
查看次数

如何通过Nginx Auth允许来自localhost的调用?

我使用以下代码:

location / {  
  satisfy any;  
  allow 127.0.0.1;  
  deny all;  
  auth_basic "closed site";  
  auth_basic_user_file conf/htpasswd;  
}
Run Code Online (Sandbox Code Playgroud)

但当我这样做curl -I "http://mysite.com"时返回401 :(
我如何允许localhost?

编辑:
我使用的机器是亚马逊ec2实例.

好,

当你打电话给mysite.com时,我没有意识到amazon ec2实例会调用它的外部/公共IP :)

真傻.

所以我接受@Capilé对他提到的hosts文件解决方法的回答.

nginx

3
推荐指数
1
解决办法
8425
查看次数

跟踪shell脚本中执行的shell命令(例如zsh)

给定一个构建和执行某些命令的shell脚本(带有条件,连接和插值)(在我的情况下调用ImageMagick的convertcli),有没有办法列出在该脚本中执行的命令?由于脚本convert多次调用args,我想获得如下列表.

convert ...
convert ...
convert ...
...
Run Code Online (Sandbox Code Playgroud)

我在OS X中使用zsh,但可以切换到bash等.

bash shell scripting zsh command-line-interface

1
推荐指数
1
解决办法
4450
查看次数