我建设使用三个数据库的表一西纳特拉的应用程序:user
,post
和like
.
我想运行一个查询,在like
表中找到一个条目,如下所示:
FIND in like WHERE user_id == params[:user_id] AND post_id == params[:post_id]
Run Code Online (Sandbox Code Playgroud)
(对于一个条件,我会用:Like.find_by_user_id(params[:user_id])
)
我的问题是:
如何使用ActiveRecord
Gem 运行具有多个条件的查找查询?
我们正在将一个Sinatra应用程序从ActiveRecord 4升级到ActiveRecord 5.之前我们有这一行:
use ActiveRecord::ConnectionAdapters::ConnectionManagement
这是因为在请求完成后没有清理连接.以下是关于此主题的SO讨论:
从ActiveRecord 5开始,此行不再有效.rails项目中的这个对话说明:
删除它有利于Executor和Reloader API.被删除的中间件不是公共API的一部分.如果你想在Rails之外使用它,你需要制作一个.
这是否意味着,如果有人要将ActiveRecord 5与Sinatra一起使用,除非开发人员重新创建现已删除的中间件,否则连接将在请求后再次"泄露"或未返回到池中?
在Sinatra示例中,现在是否需要在ActiveRecord 5中包含此行?
after do
ActiveRecord::Base.clear_active_connections!
end
Run Code Online (Sandbox Code Playgroud)
这就是链接线程的含义,但我希望得到一个明确的答案,我可以回到我的开发团队.
ruby activerecord ruby-on-rails sinatra sinatra-activerecord
ActiveRecord 4.0.0 版本中的ActiveRecord 功能是否find_each
可以接受替代?all
例如,之前我有:
all_users = User.all
Run Code Online (Sandbox Code Playgroud)
它会产生一条警告,指出类似于 ActiveRelation:all 的内容已被弃用。
作为替代,我想出了:
User.find_each do |user|
all_users += user
end
Run Code Online (Sandbox Code Playgroud)
这是可以接受的,还是我应该以另一种方式做?
我理解使用背后的原因find_each
是因为“批处理”,如果存在非常大的数据集,它将允许查询停止运行。我们假设这种情况下数据集很小。
编辑
似乎只有当您使用条件时才会出现弃用错误,例如:
User.all(:conditions => ["name like ?", "%bob%"])
Run Code Online (Sandbox Code Playgroud)
产生:
弃用警告:Relation#all 已弃用。如果你想立即加载一个关系,你可以调用#load(例如
Post.where(published: true).load
)。如果你想从关系中获取记录数组,你可以调用#to_a(例如Post.wher e(published: true).to_a
)。(从 (irb):8 处的 irb_binding 调用)
上述内容的正确替换似乎是:
User.where("name like ?", "%bob%")
Run Code Online (Sandbox Code Playgroud) ruby activerecord sinatra ruby-on-rails-4 sinatra-activerecord
我正在尝试使用带有ActiveRecord的Sinatra的更简单的设置,我遇到了一些令人费解的问题,并且会喜欢另一组眼睛.我将提供所有相关文件:
database.yml的:
development:
adapter: sqlite3
database: db/development.sqlite3
test:
adapter: sqlite3
database: db/test.sqlite3
production:
url: <%= ENV['DATABASE_URL'] %>
Run Code Online (Sandbox Code Playgroud)
Rake文件:
require_relative "demo_app"
require 'sinatra/activerecord/rake'
require 'rake/testtask'
Rake::TestTask.new do |t|
t.pattern = "test/*_test.rb"
end
Run Code Online (Sandbox Code Playgroud)
test_helper.rb中:
ENV['RACK_ENV'] = 'test'
ENV["SINATRA_ENV"] = "test"
require_relative '../demo_app'
require 'minitest/autorun'
require 'rack/test'
ActiveRecord::Migration.maintain_test_schema!
Run Code Online (Sandbox Code Playgroud)
迁移文件:
class CreatePeople < ActiveRecord::Migration
def change
create_table :people do |t|
t.string :name
t.date :dob
t.string :gender
t.string :gender
t.integer :zipcode
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,我想对测试数据库运行测试.当我尝试做的时候
rake db:create RAILS_ENV=test
- 它创建了一个development.sqlite3
rake db:migrate RAILS_ENV=test
- 相同+运行迁移 …
我有一个连接表,其中列出了一个user_id
和一个item_id
(多对多关系)。
我试图在 erb 页面上显示用户拥有的项目数量。
我该怎么做?
我的连接表/模型 UserItem 现在有 11 条记录,所以很明显,如果我这样做了UserItem.count
,它会给我 11 条记录。
但是我怎么能告诉它对于每个 user_id,计算那个特定用户有多少个 item_id?然后显然我会迭代这个。
编辑:
好的,我发现这UserItem.group(:user_id).distinct.count
给了我 {user_id => # of items per user} 的哈希值。
我如何不仅迭代散列,而且使它与每个当前的 user_id 相关联?
<% @users.each do |user| %>
<li><%= user.username %>
has been to <%= UserItem.group(:user_id).distinct.count %>!</li>
<% end %>
Run Code Online (Sandbox Code Playgroud)
到目前为止,这只是插入散列,我如何对应每个 user_id 以便它与它显示的 user.username 对齐?