我的问题很简单,但我找不到明确的答案.
我建立了每日优惠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) 我有一个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)
我在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= x和deal_id= Y …
我有一个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 页面内的数据 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) 我在 iOS11 设备上遇到了自动播放视频的大问题(至少在 iphone 7 ios 11.2.5 safari 上测试过)。
当有关自动播放视频的政策发生变化时,我们的自动播放视频停止工作。我们的应用严重依赖视频。
我们彻底改变了用户与视频互动的所有步骤,以确保它们不会被阻止,并且默认情况下它们现在处于静音状态,并在用户手势后触发自动播放。所以视频会自动播放静音,我们认为我们已经工作了几天。
但是有一个问题:上周,我在我的 girklfriend 11.2 iphone 上测试了网站和 boum ......视频被阻止了。我不明白为什么...... 发现原因是......我在给电池充电时使用她的手机!
确实在ios11上,当你给手机充电时,它会自动进入“低功耗模式”呵呵......从而阻止自动播放视频。如果您进入“设置”>“iTunes 和 Apple 商店”并转到“自动播放视频”设置,您将看到(在低电量模式下充电时):
“低功耗模式打开时自动播放视频不可用”....
所以基本上全世界成千上万的用户在充电时连接到我们的网站,他们的体验很糟糕,没有视频加载!(即使在用户激活声音之前静音,我们也非常依赖自动播放视频)
在这种情况下,我们如何检测并至少向用户提供解释性消息,例如“我们的视频无法在低功耗模式下播放(或为手机充电)。
我知道苹果在保护用户免受自动播放不良体验方面蓬勃发展,但在这里我们尽一切努力更改我们的代码库以符合他们的新政策,但我们在他们的文档中没有看到我们的网络应用程序(javascript)如何检测低功耗模式或手机充电状态)。这是不公平的:如果他们在某些情况下(例如低功耗模式)改变行为,他们应该按照自己的规则行事,让我们通过检测此设备状态来创建合规但优质的体验。这样我们就可以为用户制定一种计划 B 或后备方案。
知道如何在网络应用程序的javascript中检测iphone正在充电或处于低功耗模式吗?或者如何处理?
我试图使用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 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) 我有一个 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) 我想发送所有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”,但这不是最复杂的问题这里 :)
ruby ×3
activerecord ×2
devise ×2
html ×2
javascript ×2
performance ×2
postgresql ×2
actionmailer ×1
amazon-sqs ×1
aws-lambda ×1
aws-sdk ×1
caching ×1
css ×1
factory-bot ×1
heroku ×1
html5-video ×1
iframe ×1
image ×1
ios ×1
iphone ×1
jquery ×1
json ×1
jsonb ×1
rspec ×1
safari ×1