Articles of postgresql

当某些东西存储为数组时,Rails where子句

我正在使用PG数据库运行rails 4.2。 我有一个存储在数据库中的项目,如(model Item ): :something => [“1”, “2”, “3”] 我想得到Item.where(:something.include? => “3”) 显然这不起作用 – 但是你打算如何在rails中做到这一点?

validation在另一个表上具有条件时,数据库中的唯一性validation

当validation有条件但我的要求已经改变时,我在数据库中的唯一性validation中询问了类似的问题,因此这个问题。 当有多个进程时,在Rails中使用唯一性validation是不安全的,除非在数据库上也强制执行约束(在我的情况下是PostgreSQL数据库,所以请参阅http://robots.thoughtbot.com/the-perils-of-uniqueness-validations )。 在我的例子中,唯一性validation是有条件的:只有在另一个模型上的另一个属性变为真时才应该强制执行。 所以我有 class Parent < ActiveRecord::Base # attribute is_published end class Child < ActiveRecord::Base belongs_to :parent validates_uniqueness_of :text, if: :parent_is_published? def parent_is_published? self.parent.is_published end end 所以模型Child有两个属性: parent_id (与Parent关联)和text (文本属性)。 模型Parent有一个属性: is_published (布尔值)。 如果其parent.is_published为true,则所有类型为Child模型的text应该是唯一的。 使用http://robots.thoughtbot.com/the-perils-of-uniqueness-validations中建议的唯一索引太过限制,因为无论is_published的值如何,它都会强制执行约束。 是否有人知道PostgreSQL数据库上依赖于另一个表的“条件”索引? validation具有条件时,数据库中唯一性validation的解决方案是您的条件取决于同一个表上的属性。 还是另一种解决方法?

使用%Wildcards的Rails SQL查询在SQLite中工作但在PostgreSQL中不起作用?

我有一个查询我用于搜索:这样的条件: :conditions => [‘family_name LIKE ? OR given_name LIKE ?’, “%#{params[:search]}%”, “%#{params[:search]}%”] 查询在SQLite上本地工作正常,但是当我在PostgreSQL上推送到Heroku时,只有第一个%适用于family_name和given_name。 换句话说,它将匹配出现在单词结尾但不出现在开头或中间的关键字。 示例:现有记录包含:family_name =>“Washington”和:given_name =>“George” 搜索“ington”或“rge”将检索此记录。 搜索“Wash”或“Geo”不会。 我是一个新用户,对于rails来说我是个新手。 在此先感谢您的帮助。 解 相关主题: 1 2 这是我正在使用的修复: :conditions => [‘LOWER(family_name) LIKE ? OR LOWER(given_name) LIKE ?’, “%#{params[:search].downcase}%”, “%#{params[:search].downcase}%”]

将字符串化数组转换回数组

我使用hstore与Postgres 9.2和Rails 3.2来存储我的对象,如下所示: class User user_hstore = {:user_id =>”123″, :user_courses => [1,2,3]} end 现在,当我检索user_courses时,我得到一个这样的字符串: ‘[1, 2, 3]’ 如何将此字符串转换为Rails数组? 更好的是,有没有办法在hstore对象中存储数组,以便Rails自动将其作为数组类型检索?

按JSON数组中的匹配数查询和排序

在Postgres 9.4和Rails的jsonb列中使用JSON数组,我可以设置一个范围,返回包含传递给范围方法的数组中的任何元素的所有行 – 如下所示: scope :tagged, ->(tags) { where([“data->’tags’ ?| ARRAY[:tags]”, { tags: tags }]) } 我还想根据数组中匹配元素的数量来排序结果。 我很欣赏我可能需要超出ActiveRecord的范围才能做到这一点,所以一个vanilla Postgres SQL的答案也很有帮助,但如果它可以包含在ActiveRecord中,那么它可以是一个可链的范围。 根据要求,这是一个示例表。 (实际的架构要复杂得多,但这就是我所关心的。) id | data —-+———————————– 1 | {“tags”: [“foo”, “bar”, “baz”]} 2 | {“tags”: [“bish”, “bash”, “baz”]} 3 | 4 | {“tags”: [“foo”, “foo”, “foo”]} 用例是基于标签查找相关内容。 更多匹配标签更相关,因此结果应按匹配数量排序。 在Ruby中,我有一个像这样的简单方法: Page.tagged([‘foo’, ‘bish’, ‘bash’, ‘baz’]).all 哪个应按以下顺序返回页面: 2, […]

“Rake spec”在大多数测试中失败,但“rails s”在Diaspora源上工作正常

我有克隆的Diaspora来源,我有一个工作的本地吊舱似乎顺利运行。 但是当我运行$ rake spec一些初始测试通过,然后所有这些都开始失败。 此外,我发现有趣的是,每次运行rake spec时它们都会在不同的点上失败。 他们都失败了,错误: An error occurred in an after hook ActiveRecord::StatementInvalid: PG::ConnectionBad: PQsocket() can’t get socket descriptor: ROLLBACK occurred at /home/darshan/.rvm/gems/ruby-2.0.0-p353@diaspora/gems/activerecord-3.2.16/lib/active_record/connection_adapters/postgresql_adapter.rb:650:in `async_exec’ Postgres的日志说: could not receive data from client: Connection reset by peer unexpected EOF on client connection

将数组值发送到ruby中的sql查询?

我正在努力解决看似ruby的语义问题。 我正在编写一个从表单中获取可变数量的参数并创建Postgresql查询的方法。 def self.search(params) counter = 0 query = “” params.each do |key,value| if key =~ /^field[0-9]+$/ query << "name LIKE ? OR " counter += 1 end end query = query[0..-4] #remove extra OR and spacing from last params_list = [] (1..counter).each do |i| field = "" field << '"%#{params[:field' field << i.to_s field […]

Rails&Postgres:迁移到change_colomn会出现错误“无法转换为没有时区的类型时间戳”

用于将“deleted_at”时间列转换为日期时间列的Rails迁移失败。 关于如何解决这个问题的任何想法? 如果相关的话,这是Postgres的全新安装。 — change_column(:products, :deleted_at, :datetime) PGError: ERROR: column “deleted_at” cannot be cast to type timestamp without time zone : ALTER TABLE “products” ALTER COLUMN “deleted_at” TYPE timestamp

一次通话中多个日期范围的总和?

我有以下查询: SELECT SUM(“balance_transactions”.”fee”) AS sum_id FROM “balance_transactions” JOIN charges ON balance_transactions.source = charges.balance_id WHERE “balance_transactions”.”account_id” = 6 AND (balance_transactions.type = ‘charge’ AND charges.refunded = false AND charges.invoice IS NOT NULL) AND (“balance_transactions”.”created” BETWEEN ‘2013-12-20’ AND ‘2014-01-19’); 这样做会增加这两个日期之间发生的所有“费用”。 大。 工作良好。 问题是我几乎总是需要一次数百个日期范围的费用,这相当于我运行相同的查询数百次。 效率不高。 但有没有办法将其压缩为所有日期范围的单个查询? 例如,我将调用SUM作为一系列范围,如下所示: 2013-12-20 to 2014-01-19 2013-12-21 to 2014-01-20 2013-12-22 to 2014-01-21 2013-12-23 to 2014-01-22 […]

如何在vagranted虚拟机上访问postgresql?

我使用postgresql通过Vagrant虚拟机制作,并希望将其用作我的rails应用程序数据库。 我使用类似的Vagrantfile: Vagrant.configure(“2”) do |config| config.vm.network :private_network, ip: “192.168.33.18” config.vm.provision :chef_solo do |chef| # I take cookbook from https://github.com/opscode-cookbooks/postgresql chef.add_recipe “postgresql::server” chef.json = { postgresql: { config: { ssl: false, listen_addresses: ‘*’ }, password: { postgres: ‘postgres’ } } } end end 接下来我vagrant up并期望下一个database.yml将工作: development: database: app_development adapter: postgresql host: ‘192.168.33.18’ username: root 但这不会发生.. Rake任务失败并出现错误: […]