小编ulf*_*rts的帖子

归属触摸:true不会在association.build和嵌套属性分配上触发

OpenProject应用程序中,我们有两个模型:

CustomField

class CustomField < ActiveRecord::Base
  has_many :custom_options, -> { order(position: :asc) }, dependent: :delete_all
  accepts_nested_attributes_for :custom_options
  ...
end
Run Code Online (Sandbox Code Playgroud)

CustomOption

class CustomOption < ActiveRecord::Base
  belongs_to :custom_field, touch: true
  ...
end
Run Code Online (Sandbox Code Playgroud)

然后,在自定义字段控制器中,我们通过批量分配修改自定义字段的选项并保存记录:

@custom_field.attributes = get_custom_field_params

if @custom_field.save 
  ...
Run Code Online (Sandbox Code Playgroud)

由于我touch: truecustom_field关联中进行了配置,因此CustomOption我希望自定义字段的updated_at属性在此时进行更新,但是这不会发生。该日志未显示任何类似于的SQL请求UPDATE custom_fields SET update_at = ....。无论是添加自定义选项还是修改自定义选项,对自定义选项本身所做的更改都将正确保留。

调试显示:

  • 使用时的相同错误行为custom_field.custom_options.build及后续custom_field.save
  • 使用时的预期行为 custom_field.custom_options.create
  • 使用时的预期行为 CustomOption.create custom_field: x
  • 使用时的预期行为 custom_field.custom_option[x].destroy

我知道我可以通过定义after_save回调来解决此问题,但是这种行为确实让我感到意外,因为这是意外的。

是否期望并记录了上述行为?如果是这样,我在哪里可以找到此信息?

ruby ruby-on-rails rails-activerecord ruby-on-rails-5

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

有向无环图(DAG)中的逆关系可避免循环关系

在有向无环图(DAG)中,是否总是通过反转要添加的关系来防止由于添加关系而导致的循环传递关系?

例:

  • 现有关系:A -> BB -> C以及通过该传递关系A -> C,因此可以将其视为A -> B -> C
  • 要添加的关系:C -> A这将导致A -> B -> C -> A循环
  • 想法:将要添加的关系求反,C <- A这将导致A -> B -> C <- A并因此仍然是非循环的

这里给出的示例当然很简单,因此我想知道这种方法在所有情况下是否可行。

背景

为了建模实体之间的有向关系(例如,“跟随”,“先行”,“父”,“子”),OpenProject应用程序将其关系信息存储在有向非循环图(DAG)中。实体/节点具有日期信息,并且可以由用户重新安排。如果用户更改日期值,则可能需要自动重新安排其他实体的时间,例如,当将前任转移到未来两天时,还需要转移其后继者。

由于大多数关系都用于调度,因此正因为它是一个非循环图,所以避免了循环。它们将导致无限的调度循环。

尽管大多数关系也从语义的角度出发指明方向,但也存在通用的“相对于”关系,该关系相对于用户是无向的,只是传达存在某种关系的信息。由于其性质,前端中的用户看不到DAG中存在的“与...相关”关系的方向方面。

当用户尝试创建“相对于”关系时,他当前可能会遇到错误消息,警告循环关系,这对于用户来说是不可理解的,因为他对关系的理解是无向的。

有两种可能的方法可以解决该问题,最简单的方法是在这种情况下简单地逆转该关系,因为DAG内的方向对于这种关系对用户而言并不重要。

ruby algorithm ruby-on-rails graph-algorithm

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

Ruby hash.dig 使用数组作为参数?

我有一个嵌套的数据哈希

foo => {
  'user' => { 
    'address' => {
      'street' => '1234'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用 Hash.dig 访问这些值

foo.dig('user', 'address', 'street')
1234
Run Code Online (Sandbox Code Playgroud)

当值是可变的并且在数组中定义时,您将如何使用 hash.dig?

query=["users", "address", "street"]
  
foo.dig(query) # <= doesn't work  
foo.dig(query.to_s) # <= doesn't work  
Run Code Online (Sandbox Code Playgroud)

查看 ruby​​ 文档,Hash.dig 似乎采用多个参数,但不采用数组

https://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig

ruby hash

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

错误:在任何源中都找不到 sqlite3-1.4.0

我目前正在尝试运行 run.rb 文件,但我不断收到 sqlite3 的错误。当我输入 时bundle install,我收到此成功消息:

Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Using rake 12.3.2
Using concurrent-ruby 1.1.4
Using i18n 1.5.3
Using minitest 5.11.3
Using thread_safe 0.3.6
Using tzinfo 1.2.5
Using activesupport 5.2.2
Using activemodel 5.2.2
Using arel 9.0.0
Using activerecord 5.2.2
Using bundler 2.0.1
Using coderay 1.1.2
Using equatable 0.5.0
Using method_source 0.9.2
Using mustermann 1.0.3
Using necromancer 0.4.0
Using tty-color 0.4.3
Using pastel 0.7.2
Using pry 0.12.2
Using rack 2.0.6
Using rack-protection 2.0.5
Using …
Run Code Online (Sandbox Code Playgroud)

ruby sqlite rubygems sinatra bundler

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