小编Mat*_*ieu的帖子

迁移时是否需要对belongs_to/has_many关系使用add_index?(Rails 3.2,Active Record)

我的问题很简单,但我找不到明确的答案.

我建立了每日优惠Rails应用程序.

  • 每笔交易都有很多产品(has_many)

  • 每个产品都属于一笔交易

Rails指南中获取 2.3 ,我将在迁移中使用它:

   class CreateDeal < ActiveRecord::Migration
    def change
      create_table :deals do |t|
        t.string :name
        t.timestamps
      end

      create_table :products do |t|
        t.belongs_to :Deal
        t.timestamps
      end
    end
   end
Run Code Online (Sandbox Code Playgroud)

自动,Rails /活动记录会在产品表中添加一列Transactions_id对吗?

我是否需要通过添加到我的迁移手动(如下所示)在此deals_id列上添加索引,add_index还是"自动"完成,因为我设置了belongs_to/has_many关系?

create_table :products do |t|
  t.belongs_to :Deal
  t.timestamps

  add_index :products, :deals_id 
end
Run Code Online (Sandbox Code Playgroud)

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

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

使用Active Record查询json数组(Rails 4/postgresql9.4)

我有一个Deal模型,它具有一个名为'info'的属性,具有以下结构:

交易中的'info'栏内:

Deal1.info = [{"deal_id":"4","text1":"qqq","text2":"sqsq","image1":"sqqs","video1":"sqsq"},{"deal_id":"5","text1":"sqqs","text2":"qq"}]

# no image here inside the json
Deal2.info = 
[{"deal_id":"4","text1":"qqq","video1":"sqsq"},{"deal_id":"5","text1":"sqqs","text2":"qq"}]
Run Code Online (Sandbox Code Playgroud)

该列在移民中被定义为json

add_column :deals, :info, :json, default: '[]'
Run Code Online (Sandbox Code Playgroud)

如何在jsonb中使用活动记录查询?

  • 查找信息包含至少一个deal_id = 4的所有交易

  • 找到infos包含的所有交易,以及一个名为'image1'的密钥的json块({})(它应该只输出Deal1,而不是deal2)

postgresql json ruby-on-rails rails-postgresql jsonb

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

我应该如何使用Rails索引和查询连接表?

我在Rails 4应用程序上有一个ruby,使用设计和用户模型以及交易模型.

我正在user_deals为User和Deal之间的has_many/has_many关系创建一个表.

这是迁移

class CreateUserDeals < ActiveRecord::Migration

  def change
    create_table :user_deals do |t|
        t.belongs_to :user
      t.belongs_to :deal
      t.integer         :nb_views

      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

当用户加载一个Deal(例如Deal id = 4)时,我使用一个名为的方法 show

controllers/deal.rb
#for the view of the Deal page
def show
end
Run Code Online (Sandbox Code Playgroud)

在这个Deal id = 4页面的视图中,我需要current_user 在用户当前所在的Deal页面中显示Devise的视图.

deal/show.html

here is the nb of views of user: <% current_user.#{deal_id}.nb_views%>
Run Code Online (Sandbox Code Playgroud)

让我们说我有10M + user_deals线,我想知道我是否应该使用索引

add_index :user_deals, :user_id
add_index :user_deals, :deal_id
Run Code Online (Sandbox Code Playgroud)

或者可能

add_index(:deals, [:user_id, deal_id])
Run Code Online (Sandbox Code Playgroud)

确实在其他情况下我会说是,但在这里我不知道Rails如何在幕后工作.感觉好像Rails是知道的,而不需要我来加快这一进程,......该怎么办,就好像当Rails的负载这种观点是没有SQL查询(如"找到的意见处,NB user_id= xdeal_id= Y …

ruby activerecord ruby-on-rails devise ruby-on-rails-4

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

在Facebook嵌入iframe上防止大量的xhr/ajax调用

我有一个Bootstrap Carousel,其中有许多来自Facebook的社交嵌入,包含视频.我不会详细介绍Bootstrap Carousel,因为问题已经在这个简单的jsfiddle中可见,并且是由于Facebook嵌入.

如果您加载此页面:https://jsfiddle.net/1L95vqn4/,并查看"网络标签"上的Chrome开发工具并过滤"XHR"(禁用缓存),您将看到34个请求并加载在您甚至"播放"所有通过Facebook iframe通过ajax加载的视频之前5.8Mb.

我想懒得加载那些fb ajax请求的权重,也就是说,当用户按"播放视频"时只加载那些调用.

我很惊讶我在网上找不到任何相关内容.其他社交网络(例如twitter嵌入)在用户按下播放之前不会加载视频.即使在播放视频之前,Facebook嵌入案例中的大量数据也会被加载(5Mb,15mb,30mb ......).

请注意,仅仅是为了获取有关我实际更复杂问题的信息:在我的网站上,我实际上并没有使用这个iframe而是嵌入了样式(但是不可能在jsfiddle上放置ajax请求或者对我来说太复杂).而我的实际问题是,当您加载旋转木马时,每张幻灯片上有20个facebook嵌入视频,那么当您打开旋转木马时,它会增加巨大的性能.

$.ajax({
  url: 'https://www.facebook.com/plugins/post/oembed.json/?url=https://www.facebook.com/cocacola/posts/1526674334016658',
  dataType: 'jsonp',
  cache: false,
  success: function (data) { 
    try {         
      var embed_html = (data.html);
      $('div#item1').html(embed_html);
    } catch (err) {
      console.log(err);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

有没有办法阻止FB加载所有这些ajax xhr和mp4通过延迟加载或任何其他方式影响性能?

html javascript performance iframe jquery

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

内联base64数据uri(图像)如何被缓存?

我使用直接内联在 HTML 页面内的数据 uri base64 编码图像作为背景图像。我到处都读到,与未编码的图像相反,它们不存储在缓存中,这有时确实是一个性能问题。

但是当查看我的 chrome 开发工具时,我看到“缓存在内存中”......

在此输入图像描述

内联在 html 中的 base64 图像是否已缓存?

如果是:我的问题是:我最初检查它是因为我想分析加载 base64 内联图像的时间。所以我现在无法看到第一次下载/访问解码和加载它所花费的时间?我尝试清除浏览器历史记录,但与其他缓存(如图像等标准资源)相反,它仍然存在,也就是说,即使我清除浏览器历史记录/缓存,下次加载它时,它仍然是用 chrome dev 编写的工具作为 0ms/“来自内存缓存”:我如何清除它以查看首次访问者会发生什么?

注意:当然,在 chrome 开发工具中选择了“禁用缓存”。另外,我不确定它是否重要,但这里是 base64 和 html 代码(它非常小:不到 900 字节)

<div style="background-image: url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAARCAAKAB4DAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABQYE/8QAJBAAAgEEAQMFAQAAAAAAAAAAAQIDAAQREgUTITEyQUJRcZL/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAgP/xAAdEQACAgIDAQAAAAAAAAAAAAAAAQIDESEEInEx/9oADAMBAAIRAxEAPwCOtrYGJmdY36iEIerqUOR3I9/yqRJssYAk2jakg47HIpUFoNYygsZY7PmYmcqge2dYiQMb/Xfxmj8pPRvxWt5Bb6BYbyUB9hIRJqRgrnPmpqei7liQInmqiRIWsPUKVENIT5FQZeJJbUfId/SUW5934IpXReg7Mz8ldFyWJkfJJz8qx+JG7WWz/9k=');" ><a href="/home">
Run Code Online (Sandbox Code Playgroud)

html css performance caching image

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

检测 ios11 设备是否处于低功耗模式,以防止在正常自动播放视频时出现不良 UX

我在 iOS11 设备上遇到了自动播放视频的大问题(至少在 iphone 7 ios 11.2.5 safari 上测试过)。

当有关自动播放视频的政策发生变化时,我们的自动播放视频停止工作。我们的应用严重依赖视频。

我们彻底改变了用户与视频互动的所有步骤,以确保它们不会被阻止,并且默认情况下它们现在处于静音状态,并在用户手势后触发自动播放。所以视频会自动播放静音,我们认为我们已经工作了几天。

但是有一个问题:上周,我在我的 girklfriend 11.2 iphone 上测试了网站和 boum ......视频被阻止了。我不明白为什么...... 发现原因是......我在给电池充电时使用她的手机!

确实在ios11上,当你给手机充电时,它会自动进入“低功耗模式”呵呵......从而阻止自动播放视频。如果您进入“设置”>“iTunes 和 Apple 商店”并转到“自动播放视频”设置,您将看到(在低电量模式下充电时):

“低功耗模式打开时自动播放视频不可用”....

所以基本上全世界成千上万的用户在充电时连接到我们的网站,他们的体验很糟糕,没有视频加载!(即使在用户激活声音之前静音,我们也非常依赖自动播放视频)

在这种情况下,我们如何检测并至少向用户提供解释性消息,例如“我们的视频无法在低功耗模式下播放(或为手机充电)。

我知道苹果在保护用户免受自动播放不良体验方面蓬勃发展,但在这里我们尽一切努力更改我们的代码库以符合他们的新政策,但我们在他们的文档中没有看到我们的网络应用程序(javascript)如何检测低功耗模式或手机充电状态)。这是不公平的:如果他们在某些情况下(例如低功耗模式)改变行为,他们应该按照自己的规则行事,让我们通过检测此设备状态来创建合规但优质的体验。这样我们就可以为用户制定一种计划 B 或后备方案。

知道如何在网络应用程序的javascript中检测iphone正在充电或处于低功耗模式吗?或者如何处理?

javascript iphone safari html5-video ios

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

NoMethodError:nil的未定义方法`email':NilClass:无法使用devise/sendgrid发送电子邮件(Rails 3.2)

我试图使用sendmailer与sendgrid和设计Rails 3.2.我浏览了许多问题,例如sendmail替换smtp,创建一个config/email.yml我没有一个)和更多的想法,但没有任何作用.我肯定错过了什么.

电子邮件似乎不会被发送或生产.(sendgrid不报告任何发送的电子邮件,我检查过我的"手动测试"中从未收到过电子邮件).

运行Heroku控制台,我只是设法得到这个信息:

NoMethodError: undefined method `email' for nil:NilClass on the notifier.rb file:

:mail( :to => user.email, :subject => "Thanks for signing up" )
Run Code Online (Sandbox Code Playgroud)

完整的痕迹:

irb(main):007:0> Notifier.welcome_email(@user).deliver --trace
NoMethodError: undefined method `email' for nil:NilClass
from /app/app/mailers/notifier.rb:16:in `welcome_email'
from /app/vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/abstract_controller/base.rb:167:in `process_action'
from /app/vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/abstract_controller/base.rb:121:in `process'
from /app/vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/abstract_controller/rendering.rb:45:in `process'
from /app/vendor/bundle/ruby/1.9.1/gems/actionmailer-3.2.13/lib/action_mailer/base.rb:459:in `process'
from /app/vendor/bundle/ruby/1.9.1/gems/actionmailer-3.2.13/lib/action_mailer/base.rb:453:in `initialize'
from /app/vendor/bundle/ruby/1.9.1/gems/actionmailer-3.2.13/lib/action_mailer/base.rb:439:in `new'
from /app/vendor/bundle/ruby/1.9.1/gems/actionmailer-3.2.13/lib/action_mailer/base.rb:439:in `method_missing'
from (irb):7
from /app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
from /app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
from /app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么它不识别user.email. …

ruby ruby-on-rails actionmailer devise ruby-on-rails-3

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

rspec-PG :: UnableToSend:服务器意外关闭了连接,这可能意味着服务器异常终止

在我的ruby on Rails应用程序上,当创建模型Deal时,我使用after_create在DealPrize表上创建奖品。

Deal和DealPrize有一个属于/有很多关系:一个Deal有很多Deal奖品,一个Dealprize属于Deal。

它的工作方式是这样的:在我的管理面板(使用activeadmin)上,在Deal中,我有一个“奖品编号”列,并且我使用了after_create,因此,每次管理员创建新交易时,应用程序都会使用此award_number列,并在DealPrize表中创建此数量的奖品(根据需要插入尽可能多的行)。

我使用rspec和FactoryGirl的测试失败。可能是由于rspec / factory girl在prepare_statements中的表现不佳。我不确定。

这是我的代码

型号/deal.rb

has_many :deal_prizes, dependent: :delete_all

after_create :create_dealprizes

# Constants
TIME_SET = Time.zone.now
CONNECTION = ActiveRecord::Base.connection.raw_connection

def create_dealprizes
  begin 
    CONNECTION.describe_prepared('create_deal_prizes')
  rescue PG::InvalidSqlStatementName
    CONNECTION.prepare('create_deal_prizes', 'INSERT INTO deal_prizes (deal_id,created_at,updated_at,admin_user_id,prize_id) values ($1, $2, $3, $4, $5)') 
  end

  Deal.transaction do  
    self.prizes_number.times do |i| 
      CONNECTION.exec_prepared('create_deal_prizes',  [
        { value: self.id},
        { value: TIME_SET },
        { value: TIME_SET },
        { value: self.admin_user_id },
        { value: 5 }
      ])
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我的测试:我想确定在创建交易时,如果交易的awards_number为340,则在Dealprizes表上应按原样添加340行。

require 'spec_helper'

describe DealPrize do …
Run Code Online (Sandbox Code Playgroud)

postgresql rspec ruby-on-rails ruby-on-rails-4 factory-bot

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

Ruby on Rails 4.2 资产管道不会缩小/压缩 application-fingerprinted.js JS 文件

我有一个 ruby​​ on Rails 4.2 应用程序,并且我的资产管道在长达 2 天的时间里都面临着“令人毛骨悚然”的问题。我的产品托管在 Heroku 上,我在这里直接提到这一点,因为我认为这可能是相关的,我有他们 gem 'rails_12factor', group::production

我阅读并尝试了许多关于 Rails 资产没有编译的(太多)SO 问题的建议,但没有一个工作,因为我将进一步描述。

观察到的问题导致我提出这个 SO 问题是我的 javascript application.js 文件在生产中没有被缩小

我怎么知道?空格仍然在这里,注释还没有被删除,applciation.js,与我的 application.css 相反,只是所有 js 文件的串联,但没有压缩/缩小已经完成。

关于 SO 的大多数问题都涉及图像、css 或 js 都没有被缩小/预编译的问题,但我的情况很特殊,因为图像、css 是预编译/缩小的,但只有 js 是一个问题并且没有被缩小

我的js有问题吗?(请参阅下面的一些实验,我试图找出错误的原因)似乎不是

我在下面的设置将向您展示我如何处理资产(在我初学者理解的范围内):我使用守卫不断监视任何更改并预编译内容并将生成的/生成的 application-tr56d7.css(指纹)和 application- 45dsugdsy67.js((指纹)在 public/assets 中,然后当我在 git 上部署时,它会推送所有更改,包括预编译/缩小的文件,然后当我推送到 Heroku 时,我的生产资产设置告诉 Rails 部署我已经预编译的资产。我是一个初学者,很难理解所有众多的开发/生产环境资产设置,但我认为这就是您将在下面找到的代码中定义的内容。

我知道所有这些过程都在工作,因为每次我更改文件时,我都能找到一个新的 application-tr56d7.css 和一个新的 application-45dsugdsy67.js(当然是示例)(以及一个新的 css.gz 和 .js.z这必须是二进制的东西)

例如,每次我更改一个 js 文件时,守卫都会执行他的工作,我可以阅读如下内容:

I, [2018-02-09T09:53:41.140165 #130534]  INFO -- : Writing /home/mathieu/rails_projects/my_app/public/assets/application-af0ab4a348e4f5545c844cfac02a0670.js
Run Code Online (Sandbox Code Playgroud)

然后可以在 public/assets 文件夹中找到新生成的 application.css 和 application.js 文件:例如

/public/assets/application-1021e7d2ea120fe40c67ec288f1c6525.js …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails heroku asset-pipeline ruby-on-rails-4

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

将与模式匹配的Cloudwatch日志发送到SQS队列

我想发送所有console.log消息(出现在我的Cloudwatch日志中)与某个模式(例如,包括单词“ postToSlack”,或具有某个json字段,如“ slack:true”)匹配的地方的所有Cloudwatch日志。 ..)

但是我一直停留在尝试的最开始:我首先尝试执行最基本的任务:将执行lambda时编写的所有cloudwatch日志(通过放置在lambda函数中的console.logs)发送给SQS(为什么?,因为我先尝试做最简单的事情,然后再过滤发送的日志和不发送的日志。

因此,我创建了一个Cloudwatch规则>事件>事件模式,如下所示:

{
  "source": [
    "aws.logs"
  ]
}
Run Code Online (Sandbox Code Playgroud)

作为目标,我选择了SQS,然后创建了一个队列。

但是,当我触发例如lambda时,它们确实会出现在Cloudwatch日志中,因此我希望日志内容被“发送”到队列中,但是当我轮询/检查队列的内容时,SQ上看不到任何内容。

关于cloudwatch规则,我有什么误解吗?

上下文说明

我的lambda每小时都会大量触发(按我的规模:),在1或2分钟的时间内可能执行300至500次lambda。我想在Slack上监视所有他们的console.logs(我正在记录真正的error.stack javascript消息以及纯粹有用的消息,例如lambda输出的结果“ lambda的报告卡:company = Apple,location = cupertino。 。”)。

我可以在每个lambda上使用Slack的http调用,但是传入钩子的Slack每秒大约有1个请求的限制,之后,如果您尝试每秒发送多个传入的Webhook,则会收到429个错误...所以我认为我需要使用一个队列,这样我才不会在同一秒内有300多个lambda写入Slack,而是在一个称为slackQueue的集中队列中控制从AWS到Slack的流。

我的想法是从Cloudwatch向SQS slackQueue发送某些日志(请参阅下文),然后将此SQS队列用作lambda触发器,并随同该lambda一起发送10条消息(AWS允许的最大值;对我来说1条消息= 1 console.log)连接到一个大字符串或数组(无论如何)以将其发送到我的Slack通道(顺便说一句,您可以基于Slack限制连接并发送一个呼叫,最多100条Slack消息,所以如果我可以处理100条消息=我想将console.log和串联起来,但是我认为AWS的当前批处理大小限制为10),这样可以确保我每秒向Slack发送的请求数不超过1(该请求的内容为10 console.logs )。

当我在“某些日志”上面说时,这意味着,我实际上不希望将所有日志发送到队列中(因为我不希望它们在Slack上发送):实际上,我不希望纯粹地“调试”像a console.log("entered function foo").这样的消息在开发过程中很有用,但与Slack无关。

关于一些评论:据我所知(我不是AWS专家),我不想使用cloudwatch警报或指标过滤器,因为它们价格昂贵(我每小时会触发数百次),而不会不能真正满足我的需要:我不希望仅在严重问题或出现“问题”(例如CPU> xxx ...)时才在Slack上阅读,而是真正发送定期过滤我的几乎所有日志都流向Slack,以读取Slack内部而不是AWS内部的日志,因为Slack是一整天都开放的工具,它用于处理来自AWS以外的其他来源的日志/消息作为集中位置,并且我们可以更好地理解漂亮的Slack附件消息格式。当然,最后一个lambda(将消息发送到slack的那个)会做一些格式化以添加斜体/粗体/等,并且slack要求markdown才能很好地格式化“ Slack Attachments”,但这不是最复杂的问题这里 :)

amazon-sqs amazon-web-services aws-sdk aws-lambda

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