通过Rails迁移删除数据库表列的语法是什么?
我是Ruby的新手,不知道如何将新项添加到已经存在的哈希.例如,首先我构造哈希:
hash = {item1: 1}
Run Code Online (Sandbox Code Playgroud)
之后想要添加item2所以在此之后我有这样的哈希:
{item1: 1, item2: 2}
Run Code Online (Sandbox Code Playgroud)
我不知道哈希上有什么方法可以帮助我吗?
如果一个字符串在Ruby(没有rails)中以另一个字符串开头的最佳方法是什么?
几天来我一直试图找到应该很容易做到的接缝的底部......然而,我仍然是铁轨和红宝石世界的新手,我只是无法解决这个问题. ..: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) 我尝试将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) ActiveRecord文档,Google和StackOverflow在update_all()的返回值上是阴谋的
update_all()返回什么?
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) TL; DR:是否可以在中指定架构table_name_prefix?
我们有一个大型的Rails应用程序,它不是传统的多租户应用程序。我们有一百个客户,全部由一个应用程序支持,并且这个数字每年增长不会超过1-2个。当前,每个客户端都有自己的Postgresql数据库。
我们正在解决一些基础结构方面的问题,即拥有这么多不同的数据库……最紧迫的是,在同时处理许多客户端数据时,存在大量并发数据库连接。
该应用程序甚至对客户都不可见,因此许多传统的多租户网站理念在这里并不适用。
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吗?前言
默认情况下,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.
问题
如果发出时区偏移后缀,有没有办法强制序列化失败,那么我们不做任何假设?
如何从命令行运行 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,所有警察都在命令行上给出?
ruby ×5
activerecord ×3
rspec ×2
c# ×1
database ×1
datetime ×1
hash ×1
json.net ×1
postgresql ×1
rspec2 ×1
rubocop ×1
startswith ×1
string ×1
testing ×1