小编Nie*_* B.的帖子

Rails ActiveRecord - 如何锁定表格进行读取?

我有一些Rails ActiveRecord代码,如下所示:

new_account_number = Model.maximum(:account_number)
# Some processing that usually involves incrementing
# the new account number by one.
Model.create(foo: 12, bar: 34, account_number: new_account_number)
Run Code Online (Sandbox Code Playgroud)

这段代码本身很好用,但我有一些由DelayedJob工作人员处理的后台作业.有两个工作者,如果他们都开始处理一批处理此代码的作业,他们最终会创建Model具有相同account_number的新记录,因为找到最大值和创建具有更高帐户的新记录之间的延迟数.

现在,我已经通过在数据库级别向模型表添加唯一性约束来解决它,然后通过在该约束触发异常的情况下重新选择最大值来重试.

然而,感觉就像一个黑客.

在数据库级别向account_number列添加自动递增不是一种选择,因为account_number分配不仅仅需要递增.

理想情况下,我想锁定有问题的表进行读取,因此在完成之前,没有其他人可以对表执行最大选择查询.但是,我不知道该怎么做.我正在使用Postgresql.

sql postgresql activerecord locking ruby-on-rails

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

作曲家:巨大的供应商文件夹

我正在尝试使用Composer并来自RubyGems/Bundler背景,它确实展示了一些有趣的行为.

我尝试创建一个新的Laravel项目,令我惊讶的是,我发现我最终得到了一个超过70兆字节的供应商文件夹.

虽然Laravel确实提供了很多功能,但我发现它的大小很奇怪,所以我检查了vendor文件夹的内容,发现它不仅包含代码,还包含单元测试,文档和整个git历史记录.对于Swiftmailer,我甚至为各种电子邮件标准找到了lenghty RFC.

虽然访问依赖项的规范和存储库历史记录很方便,但它确实创建了一个相当耗时的部署过程,并且使用不相关的数据来填充生产服务器.

我确实理解我可能会编写一个工匠命令来"构建"应用程序并通过查看所有git历史来消除依赖关系,但它似乎是一个可能已经解决的问题的肮脏解决方案.

所以问题是:是否有一种安装作曲家依赖关系的方法,所以只下载运行(Laravel)应用程序实际需要的代码?

更新:使用 --prefer-dist

我发现您可以--prefer-dist在创建新项目时传递该选项,.eg

composer create-project laravel/laravel my-new-project --prefer-dist
Run Code Online (Sandbox Code Playgroud)

这使得Composer更喜欢压缩分发而不是直接从VCS获取源代码(例如GitHub)

这使您无法获取git历史记录并将供应商文件夹减少到17兆字节.但是,仍然包括规格,文档等.如果有办法将其降低到几兆字节,那就太好了.

php composer-php laravel-4

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

Capybara:测试JavaScript运行没有错误

我想写一个请求规范,验证在给定页面上加载和执行javascript没有任何错误.

我知道我可以在我的JavaScript文件的末尾添加一些东西并断言这些内容的存在,但这感觉就像一个黑客,并迫使我污染我的代码以进行测试.我更愿意做一些事情.

visit some_path
page.should succesfully_run_javascript
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails capybara

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

使用set -e运行bash函数而不退出shell

考虑以下功能

function current_dir {
  set -e
  git foobar
  echo "I will not print this, because git foobar returned a non-zero exit code"
}
Run Code Online (Sandbox Code Playgroud)

现在,当我获取函数并尝试在我的shell中调用它时,它不仅退出函数,还退出shell本身.

如何避免这种情况?

bash shell

7
推荐指数
2
解决办法
1424
查看次数

构建并推送多拱形泊坞窗图像

我正在尝试根据在postgresRaspbian和Mac OS X/Debian 上运行的官方图像制作自定义图像.

当我做的时候

from postgres:10.4 并且构建了Dockerfile,似乎docker隐式选择了postgres的x64版本,然后只根据该架构构建了一个新的图像.

因此,当我将图像推送到我的GitLab注册表并再次下载时,它不起作用.它抛出一个standard_init_linux.go:190: exec user process caused "exec format error",我认为这是另一种说错建筑的方式.

我可以通过https://blog.docker.com/2017/09/docker-official-images-now-multi-platform/收集,在一个图像中支持多个架构,使其成为"多拱".然而,尽管资源很多,但对于我如何构建自己的多拱形图像以及需求是什么并不明显.

理想情况下,我希望能够无缝地构建和推送armv7和x64版本 - 来自Raspberry Pi/Raspbian主机和Mac/Debian主机.

我发现了这个问题:交叉编译多拱容器

其中一个答案表明了一个过程.但是,该进程不支持使用该RUN命令的dockerfiles ,这是我的项目的要求.

macos raspbian docker

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

添加除Dockerfile之外的项目文件夹

我试图在docker容器中运行一个小的Rails应用程序.我越来越近,但我正在努力使用我的Dockerfile.

我已将以下命令添加到我的Dockerfile中,以递归方式添加项目文件夹中的所有文件.

ADD .
Run Code Online (Sandbox Code Playgroud)

在此之后,我跑了

RUN bundle install --deployment
Run Code Online (Sandbox Code Playgroud)

但是,因为我的ADD命令还添加了Dockerfile,这意味着每次编辑Dockerfile时我的图像缓存都会中断,迫使我重新绑定.

根据https://docs.docker.com/reference/builder/#the-dockerignore-file,我可以使用一个.dockerignore文件来忽略Dockerfile,但这会导致docker build命令失败

2014/09/17 22:12:46 Dockerfile was excluded by .dockerignore pattern 'Dockerfile'
Run Code Online (Sandbox Code Playgroud)

如何轻松地将我的项目添加到我的图像,但排除Dockerfile,所以我不打破docker镜像缓存?

ruby-on-rails docker

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

如果有价值,就做点什么

我经常发现自己编写Ruby代码,在那里我检查是否存在值,然后在存在的情况下使用该值执行某些操作.例如

if some_object.some_attribute.present?
  call_something(some_object.some_attribute)
end
Run Code Online (Sandbox Code Playgroud)

如果它可以写成,我认为它会很酷

some_object.some_attribute.presence { |val| call_something(val) }
=> the return value of call_something
Run Code Online (Sandbox Code Playgroud)

任何人都知道Ruby中是否有这样的功能或者是否支持activesupport?

我打开了此功能的拉取请求.

ruby ruby-on-rails activesupport

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

最小高度和边距

考虑以下HTML:

.top {
  min-height: 150px;
}

p {
  margin: 50px;
}

div {
  background-color: #eee;
}
Run Code Online (Sandbox Code Playgroud)
<div class="top">
  <p>Welcome</p>
</div>
<div class="content">Main content</div>
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看它的运行情况:

http://jsfiddle.net/Lp4tp/1

在Chrome(适用于Ubuntu)中,p标签上定义的边距似乎导致顶部div及其周围元素之间的间距,而不是扩展顶部div并产生相当于在顶部div上添加50像素填充的效果。

这是正确的行为吗?如果是这样,我如何确保top div中的子元素不能在top div和内容div之间创建不希望的空间。

注意

如果我使用固定高度而不是最小高度,则顶部和内容div之间的间距消失,但是顶部仍在其上方产生50像素的空白。

css

5
推荐指数
2
解决办法
1046
查看次数

将原型附加到JavaScript对象

假设我有人物对象的以下JSON.

[
  {
     "name": "Alice",
     "age": 28,
  },
  {
     "name": "Bob",
     "age": 33
  }
]
Run Code Online (Sandbox Code Playgroud)

如果我解析这个,我将得到一个包含两个JavaScript对象的数组.让我们说,我想用这个名为introduction的方法来装备这两个对象,它就是这样做的

function introduce() {
  return "My name is " + this.name + " and I am " + this.age + " years old.";
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以迭代我的两个人并打电话

person.constructor.prototype.introduce = introduce
Run Code Online (Sandbox Code Playgroud)

但是,这将在所有JavaScript对象中公开介绍函数,而不仅仅是上面的两个.

我也可以手动将函数附加到每个对象,但如果我想用其他函数扩展我的人员,我将不得不再次迭代所有人.

理想情况下,我想要一个原型,我可以使用该introduce方法,然后将这个原型附加到我的所有人,所以如果我以后扩展原型,我的人也将获得额外的功能.

问题是:如何?

javascript json prototype prototypal-inheritance

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

ActiveStorage 和直接上传在开发中不起作用

我正在试验 ActiveStorage,因为我想创建一个 Rails 应用程序,用户可以在其中直接上传到 DigitalOcean 空间。

但是,我已经遇到了 CSRF 问题。

我在我的 storage.yml 中声明了数字海洋:

do:
  service: S3
  access_key_id: this_is_a_secret
  secret_access_key: this_is_also_a_secret
  region: ams3
  bucket: this_is_also_a_secret
  endpoint: 'https://this_is_also_a_secret.ams3.digitaloceanspaces.com'
Run Code Online (Sandbox Code Playgroud)

我选择了我的存储服务 development.rb

config.active_storage.service = :do
Run Code Online (Sandbox Code Playgroud)

我已经将 aws gem 添加到 Gemfile

gem "aws-sdk-s3", require: false
Run Code Online (Sandbox Code Playgroud)

activestorage在我的 javascript 包中需要。

我已将以下内容添加到我的视图中以进行测试:

= form_for(VideoUpload.first, url: "/") do |form|
  div = form.file_field :file, direct_upload: true
  div = form.submit("Send that file")
Run Code Online (Sandbox Code Playgroud)

当我提交表单时,activestorage.js 库会启动。它调用它又http://127.0.0.1:3000/rails/active_storage/direct_uploads由于缺少 CSRF 令牌而抛出 422。我已经检查了请求,控制器没有错。HTTP 标头中没有设置 CSRF 令牌,X-CSRF-Token奇怪地设置为undefined.

请求正文包含:{"blob":{"filename":"9T6qqsA-png-wallpapers.jpg","content_type":"image/jpeg","byte_size":122990,"checksum":"gqU9VBgS9mmH7s45qHIbug=="}},所以这里也没有 CSRF …

ruby-on-rails rails-activestorage

5
推荐指数
0
解决办法
426
查看次数