天道酬勤,学无止境

ruby

Rails ActiveRecord: Missing column in grouping query

问题 Key.select('products.name as product, product_groups.name as product_group, AVG(keys.cost) as cost') .group('products.id, product_groups.id') .left_joins(:product,:product_group) 结果: => #<ActiveRecord::Relation [#<Key id: nil, cost: 0.6e1>, #<Key id: nil, cost: 0.4e1>]> 预期返回 3 字段,但返回值:2 字段。 I found the solution. The detail areas in the console did not appear as HASH. 回答1

2022-07-11 09:59:46    分类:技术分享    ruby-on-rails   ruby   activerecord

Advice on how to send email to multiple users based on an association

问题 我创建了一个 Ruby on Rails 应用程序,用户可以在其中跟踪锻炼情况。 可以私下或公开这样做。 在公开的锻炼(锻炼workout.share == 1 )上,我允许用户发表评论。 当对锻炼创建评论时,会通过电子邮件通知锻炼所有者。 这一切都很好。 我现在正在寻找一些建议,以让对锻炼发表评论的用户也可以通过电子邮件收到通知。 这是一个例子。 用户 A 创建锻炼 1。用户 B 对锻炼 1 发表评论,用户 A 收到电子邮件通知。 用户 C 还对锻炼 1 发表评论,并且用户 A 和用户 B 都收到电子邮件通知。 告诉我的应用程序遍历所有评论过锻炼 1 的用户并向他们发送电子邮件的最佳方法是什么? 目前,我正在向锻炼所有者发送一封电子邮件,其中包含 comments_controller 中的以下代码(我意识到这可能是更简洁的代码): class CommentsController < ApplicationController ... def create @workout = Workout.find(params[:workout_id]) @comment = @workout.comments.build(params[:comment]) @comment.user = current_user respond_to do |format| if

2022-05-17 02:32:04    分类:技术分享    ruby-on-rails   ruby   email   mailer

rails redirect_to :back not working

问题 我正在尝试使用以下内容: class PaymentsController < ApplicationController def addproduct (session[:products] ||= []) << params[:item] redirect_to :back end end 我得到了这个例外: undefined method `back_url' for #<PaymentsController:0x007ff682c467a8> 为什么会这样? 回答1 Rails 5 有 redirect_back,而不是redirect_to :back 。 它已更改,因为它用于在请求的HTTP_REFERER不存在时引发异常。 所以使用这个: redirect_back fallback_location: root_path 您可以根据需要将root_path更改为其他内容。 回答2 redirect_to :back在 Rails 5.0 中被弃用(参见 PR),然后在 Rails 5.1 中被删除 请改用以下内容: redirect_back(fallback_location: root_path)

2022-05-17 00:56:04    分类:技术分享    ruby-on-rails   ruby   redirect

Collection_select not saving

问题 我正在尝试实现一个集合选择来创建我的模型组和用户之间的关联(加入表:groups_user)。 但是当我使用collection_select 时,这个关联并没有保存。 我完全不知道可能是什么问题 我的代码: 看法 : <%= simple_form_for(group, remote: true) do |f| %> <%= f.collection_select :user_ids, @users.order(:pseudo), :id, :pseudo, {}, {multiple: true} %> <%= f.submit %> <% end %> 和我的控制器(组): def group_params params.require(:group).permit(:name, :user_ids) end 仅供参考,我有一个单独提交关联的操作,它运行良好! 但是当我尝试实现一个集合来集体选择时,它不起作用 回答1 def group_params params.require(:group).permit(:name, :user_ids => []) end

2022-05-16 23:38:19    分类:技术分享    ruby-on-rails   ruby   collection-select

Error on installing ruby with jemalloc

问题 我在 ubuntu 12.04.5 LTS 上并尝试使用 jemalloc 安装 ruby​​。 jemalloc 安装成功(https://blog.scalingo.com/2017/05/02/improve-ruby-application-memory-jemalloc.html)但是在安装 ruby​​ 2.3.4 时,它给出了以下错误。 >rvm install 2.3.4 -C --with-jemalloc Warning, new version of rvm available '1.29.1', you are using older version '1.27.0'. You can disable this warning with: echo rvm_autoupdate_flag=0 >> ~/.rvmrc You can enable auto-update with: echo rvm_autoupdate_flag=2 >> ~/.rvmrc ruby-2.3.4 - #removing src/ruby-2.3.4.. Checking requirements for ubuntu. Requirements installation successful. Installing Ruby from source to: /home

2022-05-16 22:31:09    分类:技术分享    ruby   rvm   jemalloc

Popen getting pid of newly run process

问题 我想在后台运行一些应用程序,然后用 pid 杀死它。 pipe = IO.popen("firefox 'some_url' 2>&1 &") pipe.pid 这段代码启动了firefox并返回了一些pid,但不幸的是它不是firefox的pid。 pipe = IO.popen("firefox") pipe.pid 此代码启动 firefox 并返回 mi 一些 pid,即 firefox 的 pid。 是否有任何解决方案可以启动外部应用程序并获取其 pid? Firefox 只是举例,它可以是任何其他应用程序。 我也尝试过使用以下库:Open3 和 Open4,但效果似乎相同。 我也想知道'$!' bash 变量是解决这个问题的好方法吗? 在后台运行一些东西并阅读'$!',你怎么看? 回答1 由于您在后台运行它( command & ),您将获得解释器的 PID: >> pipe = IO.popen("xcalc &") >> pipe.pid => 11204 $ ps awx | grep "pts/8" 11204 pts/8 Z+ 0:00 [sh] <defunct> 11205 pts/8 S+ 0:00 xcalc 删除& : >> pipe = IO.popen("xcalc") >> pipe.pid => 11206 $ ps awx |

2022-05-16 19:29:03    分类:技术分享    ruby   linux   io   popen   pid

Ruby strftime '%Z' method returns '0545' instead of 'NPT'

问题 将我的 MacOS 升级到最新版本后,Time#strftime 方法出现了一些奇怪的问题。 Time.now.in_time_zone("Kathmandu").strftime("%Z") #=> '+0545' Time.now.in_time_zone("Bangkok").strftime("%Z") #=> '+07' Time.now.in_time_zone("Nairobi").strftime("%Z") #=> 'EAT' Time.now.in_time_zone("New Delhi").strftime("%Z") #=> 'IST' 我目前的红宝石版本是: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16] 我试过了: ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16] 仍然无法正常工作 我在我朋友的机器上试过这个(ruby 2.4.1p111(2017-03-22 修订版 58053)[x86_64-darwin15])并且工作正常。 Time.now.in_time_zone("Kathmandu").strftime("%Z") #=> 'NPT' Time.now.in_time_zone(

2022-05-16 19:06:12    分类:技术分享    ruby-on-rails   ruby   macos

Rails: Your user account isn't allowed to install to the system RubyGems

问题 我正在运行命令 bundle install 在项目文件夹中。 在某些项目文件夹中会产生错误,而在其他项目文件夹中则不会产生错误。 错误是: 您的用户帐户不允许安装到系统 RubyGems 我知道这可以通过遵循推荐的建议来解决: bundle install --path vendor/bundle 我的问题是为什么行为不一致? 回答1 就我而言,我解决了错误消息所暗示的问题: Your user account isn't allowed to install to the system RubyGems. You can cancel this installation and run: bundle install --path vendor/bundle to install the gems into ./vendor/bundle/ 所以,而不是: bundle install 我跑了: bundle install --path vendor/bundle 这就是这个家伙的解决方案。 该解决方案的缺点是它在当前文件夹中创建了一个vendor文件夹,如果要通过 Git 分发应用程序,可以将其添加到.gitignore中。 回答2 我有过类似的经历。 我会简单地运行下面的代码来临时修复它 bundle install --path vendor/bundle

2022-05-16 11:28:05    分类:技术分享    ruby-on-rails   ruby   rubygems   bundler   gemfile

How do I detect if a line in a string has nothing but line carriage(s)?

问题 我有一个包含多行的字符串。 我正在做的是检查每一行的具体特征,然后相应地处理它们。 一个特征是该行是否以+或-开头。 这工作得很好。 另一个特征是它是否只包含一个\n ,但我不知道如何检查。 下面是一个字符串的例子: "+ end\n", " \n", "- # Specifies a many-to-many relationship with another class. This associates two classes via an\n", 我有一些简单的检查来检测第一行和最后一行,看起来像这样<% if line.start_with?("-") %> 。 但不太确定如何检查该行是否只有一个(或多个) \n 。 请注意,其他行可以在该行中有\n并且不应触发此条件(如第一行和最后一行)。 关键是该行是否仅包含行回车符\n 。 编辑 1 请注意,我并不是要删除这些行。 我只是在寻找一个正则表达式或者一个内置的 ruby​​ 函数,它可以帮助我轻松识别符合上述条件的行。 回答1 def if_empty?(string) string.strip.empty? end if_empty?(" \n\n\n\n") => true

2022-05-16 09:21:16    分类:技术分享    ruby

Where Clause with Less/Greater than after a Join

问题 我正在尝试将joins与where子句结合起来,但where子句不是测试相等性,而是测试大于或等于。 我知道在标准的 where 子句中,我可以这样做: Group.where("vote_deadline_at <= ?", Time.now) 查找投票截止日期在未来的所有组。 但是,如果这是在joins之后发生的,如下所示: User.likes.where(liked_type: "Post").joins("INNER JOIN posts ON posts.id = liked_id").where(posts: {context_type:"Group"}).joins("INNER JOIN groups ON groups.id = posts.context_id").where(groups: {"vote_deadline_at <= ?",Time.now}) 直到最后where(groups: {"vote_deadline_at <= ?",Time.now})子句的所有内容都可以正常工作。 它返回一个 186 行的 ActiveRecord 集合。 但是,当我添加最后一个where子句时,我得到了错误: SyntaxError: unexpected '}', expecting end-of-input ...ote_deadline_at <

2022-05-16 06:03:30    分类:技术分享    ruby-on-rails   ruby   join   activerecord   where-clause