小编Dav*_*mpy的帖子

600
推荐指数
17
解决办法
35万
查看次数

如何将新项添加到哈希

我是Ruby的新手,不知道如何将新项添加到已经存在的哈希.例如,首先我构造哈希:

hash = {item1: 1}
Run Code Online (Sandbox Code Playgroud)

之后想要添加item2所以在此之后我有这样的哈希:

{item1: 1, item2: 2}
Run Code Online (Sandbox Code Playgroud)

我不知道哈希上有什么方法可以帮助我吗?

ruby hash

164
推荐指数
6
解决办法
28万
查看次数

如何在Ruby中查找字符串是否以其他字符串开头?

如果一个字符串在Ruby(没有rails)中以另一个字符串开头的最佳方法是什么?

ruby string startswith

146
推荐指数
3
解决办法
9万
查看次数

Counter_cache列的Rspec测试返回0

几天来我一直试图找到应该很容易做到的接缝的底部......然而,我仍然是铁轨和红宝石世界的新手,我只是无法解决这个问题. ..:p

无论如何,我遇到的问题是我的模型中有一些:counter_cache列,这些列在手动测试时都非常好用.但是,我想要做TDD的事情,我不能缝在rspec测试他们的一些未知的原因?

无论如何这里是我的模型的例子(用户,评论和媒体):

class User < ActiveRecord::Base
  has_many :comments
  has_many :media, dependent: :destroy
end  

class Comment < ActiveRecord::Base
  attr_accessible :content, :user_id
  belongs_to :commentable, polymorphic: true, :counter_cache => true
  belongs_to :user, :counter_cache => true

  validates :user_id, :presence => true
  validates :content, :presence => true, :length => { :maximum => 255 }
end

class Medium < ActiveRecord::Base
 attr_accessible :caption, :user_id

 belongs_to :user, :counter_cache => true

 has_many :comments, as: :commentable

 validates :user_id, presence: true
 validates :caption, length: { maximum: 140 }, allow_nil: …
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails counter-cache rspec2

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

reset_counters引发未定义的方法错误,但在类似的关系上工作正常

我尝试将counter_cache添加到User以计算自有项目.

用户有很多项目,Project有很多用户,但Project属于其中一个.

所以我写了一个迁移,为counter_cache添加额外的计数字段.

评论没有问题reset_counter.

User.reset_counters user.id, :projects提出NoMethodError:未定义的方法`counter_cache_column'为nil:NilClass.

项目上的counter_cache也正常工作.如果我添加额外的项目,它将增加projects_count字段,如果我删除一个 - 减少.

楷模

class User < ActiveRecord::Base
  has_many :projects, :through => :team_members
  has_many :team_members

class TeamMember < ActiveRecord::Base
  belongs_to :user
  belongs_to :project

class Project < ActiveRecord::Base
  has_many :users, :through => :team_members
  has_many :team_members
  belongs_to :leader, :class_name => :User, :counter_cache => true

class Comment < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
Run Code Online (Sandbox Code Playgroud)

移民

class AddCounters < ActiveRecord::Migration
  def up
    add_column :users, …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails ruby-on-rails-3

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

update_all()的返回值是多少?

ActiveRecord文档,Google和StackOverflow在update_all()的返回值上是阴谋的

update_all()返回什么?

  • 记录数量?
  • 成功状态?
  • 更新记录的ID?

activerecord ruby-on-rails rails-activerecord

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

在rspec中删除测试 - 更改(模型,:计数)失败 - 为什么需要重新加载?

TLDR:App.count需要重新加载才能查看创建的记录.为什么?

我发现很多引用测试DELETE方法,如下所示:

expect { delete_request }.to change(App, :count).by(-1)
Run Code Online (Sandbox Code Playgroud)

这是有道理的,并且适用于某些类似的场景.但是,在测试不应该工作的删除时,我发现了一个问题,例如没有用户登录时.

这是我开始的地方,有两种方法来测试同一件事:

require 'rails_helper'

RSpec.describe V1::AppsController, type: :controller do
  let(:user) { create(:user) }
  let(:app) { create(:app, account: user.account) }

  describe 'DELETE destroy when you are not logged in' do
    let(:delete_request) { delete :destroy, id: app, format: :json }

    it 'does not delete the app (.count)' do
      expect { delete_request }.not_to change(App, :count)
    end

    it 'does not delete the app (.exists?)' do
      delete_request
      expect(App.exists?(app.id)).to eq(true)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这就是rspec所说的:

V1::AppsController
  DELETE destroy when …
Run Code Online (Sandbox Code Playgroud)

ruby testing rspec ruby-on-rails

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

在“ table_name_prefix”中指定架构可以吗?

TL; DR:是否可以在中指定架构table_name_prefix

我们有一个大型的Rails应用程序,它不是传统的多租户应用程序。我们有一百个客户,全部由一个应用程序支持,并且这个数字每年增长不会超过1-2个。当前,每个客户端都有自己的Postgresql数据库。

我们正在解决一些基础结构方面的问题,即拥有这么多不同的数据库……最紧迫的是,在同时处理许多客户端数据时,存在大量并发数据库连接。

该应用程序甚至对客户都不可见,因此许多传统的多租户网站理念在这里并不适用。

  • 每个租户都有一个单独的Postgres数据库,由database.yml管理。
  • 每个数据库都有一个以租户命名的模式。
  • 我们有一个针对每个租户的特定模型,其代码明显不同。
  • 每个模型都使用Establishment_connection选择不同的数据库和模式。
  • 每个模型都使用一个table_name_prefix与客户的唯一名称不同的名称。

每个租户的表差异很大。没有希望或渴望使客户正常化。客户端不是动态配置的-始终是带有迁移的新代码版本。

我们打算将每个客户端模式移动到一个数据库中,因此需要较少的不同连接池。我们当前在数据库,架构和表名称中拥有的唯一名称意味着没有名称冲突的可能性。

我们查看了Apartment的宝石,并确定它不适合我们正在做的事情。

我们可以将所有一百个模式添加到schema_search_path中,以便所有客户端可以共享同一连接池,并且仍然可以找到其模式。我们认为,这将使数据库连接数减少一百倍。但是我们对此有些不安。我还没有讨论过多少。也许那会行得通,也许不会有性能损失查找表。

通过在table_name_prefix中添加架构,我们找到了一个非常有前景的简单解决方案。我们已经将其设置为:

def self.table_name_prefix
  'client99_'
end
Run Code Online (Sandbox Code Playgroud)

通过在Rails 4(当前版本)和Rails 5源代码中进行试验和查看,可以指定模式(“ tenant_99”)以及传统的表前缀(“ client99”):

def self.table_name_prefix
  'tenant_99.client99_'
end
Run Code Online (Sandbox Code Playgroud)

在更改之前,查询如下所示:

SELECT COUNT(*) FROM 'client99_products'
Run Code Online (Sandbox Code Playgroud)

之后,根据需要包含模式:

SELECT COUNT(*) FROM 'tenant_99.client99_products'
Run Code Online (Sandbox Code Playgroud)

这似乎满足了我们的需求,没有任何缺点。我在Interwebs上搜索了鼓励或劝阻这种做法的人,但没有找到任何提及的方式。

因此,通过所有这些,以下是我尚未找到明确答案的问题:

  • 是否担心其中列出了太多的架构schema_search_path
  • 可以放置架构名称table_name_prefix吗?

postgresql activerecord ruby-on-rails

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

在WebAPI 2中严格执行ISO8601日期格式

前言

默认情况下,JSON序列化程序通过以下方式支持ISO DateTime标准 IsoDateTimeConverter

通过一些额外的自定义,我们可以强制所有日期时间都是UTC(http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization)

jsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
Run Code Online (Sandbox Code Playgroud)

这再次按预期工作,1972-09-18T02:29:12.264513Z并且1972-09-18T04:29:12.264513+02:00两者等同于1972-09-18 02:29:12 AM序列化之后.

问题

但遗憾的是,省略时区偏移后缀也成功序列化.所以1972-09-18T04:29:12.264513相当于1972-09-18 04:29:12 AMUTC.

这里的问题是我们假设消费者知道日期格式并且理解(根据我们的文档)日期总是假定为UTC.

问题

如果发出时区偏移后缀,有没有办法强制序列化失败,那么我们不做任何假设?

c# serialization datetime json.net asp.net-web-api2

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

Rubocop——仅在命令行上指定多个警察?

如何从命令行运行 rubocop,只为几个警察?

我可以为一个警察成功运行它:

rubocop --only Layout/HeredocIndentation 
Run Code Online (Sandbox Code Playgroud)

这可行,但我想一次为多个警察运行它。我尝试了三种不同的变体,但没有运气:

rubocop --only Rails/Blank --only Layout/HeredocIndentation --only Naming/FileName 
rubocop --only Rails/Blank Layout/HeredocIndentation Naming/FileName 
rubocop --only Rails/Blank, Layout/HeredocIndentation, Naming/FileName 
Run Code Online (Sandbox Code Playgroud)

https://docs.rubocop.org/rubocop/usage/basic_usage.html说:

--only  |  Run only the specified cop(s) and/or cops in the specified departments.
Run Code Online (Sandbox Code Playgroud)

...但没有给出语法示例。

我怎样才能只针对几个警察运行 rubocop,所有警察都在命令行上给出?

rubocop

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