Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过解析DateTime rails,使用3个函数在处创建筛选器_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 通过解析DateTime rails,使用3个函数在处创建筛选器

Ruby on rails 通过解析DateTime rails,使用3个函数在处创建筛选器,ruby-on-rails,ruby,Ruby On Rails,Ruby,目前,我正在通过查询从数据库中获取值 created_ats = Snapshot.connection.select_all("SELECT created_at from snapshots WHERE snapshot_id >= '#{camera_id}_#{from_date}' AND snapshot_id <= '#{camera_id}_#{to_date}'") 这只是一个例子,天数和时间可以完全填满,也可以部分填满 有一个名为INTERVAL的字段。这被视为

目前,我正在通过查询从数据库中获取值

created_ats = Snapshot.connection.select_all("SELECT created_at from snapshots WHERE snapshot_id >= '#{camera_id}_#{from_date}' AND snapshot_id <= '#{camera_id}_#{to_date}'")
这只是一个例子,天数和时间可以完全填满,也可以部分填满

有一个名为
INTERVAL
的字段。这被视为会议记录。 现在,整个场景是什么,从我创建的查询来看,它是RubyonRails中的general
timestamps

我想过滤那些在上创建的
,并在上面的信息中提供日期和时间将X(间隔)添加到在创建的时间

例如,在天和时间之间进行精炼。我们将有一个创建的at列表,因此从第一个创建的at开始,我们将在创建的at中添加x.minutes,并确保(创建的at+x.minutes)也存在于创建的at中(我们经过几天和几个小时的优化后得到),是的,然后保存,否则保留

到目前为止,我试过的是这个,它并没有像我希望的那样工作,根据我的说法,它似乎没有错误,但仍然没有给我具体的值

class SnapshotExtractor < ActiveRecord::Base
    establish_connection "evercam_db_#{Rails.env}".to_sym

    belongs_to :camera
    require "rmega"
    require "aws-sdk-v1"
    require 'open-uri'

  def self.connect_mega
    storage = Rmega.login("#{ENV['MEGA_EMAIL']}", "#{ENV['MEGA_PASSWORD']}")
    storage
  end

  def self.connect_bucket
    access_key_id = "#{ENV['AWS_ACCESS_KEY']}"
    secret_access_key = "#{ENV['AWS_SECRET_KEY']}"
    s3 = AWS::S3.new(
      access_key_id: access_key_id,
      secret_access_key: secret_access_key,
    )
    bucket = s3.buckets["evercam-camera-assets"]
    bucket
  end
  # def self.test
        # snapshot_bucket = connect_bucket
        # storage = connect_mega
        # folder = storage.root.create_folder("dongi")
        # s3_object = snapshot_bucket.objects["gpo-cam/snapshots/1452136326.jpg"]
        # snap_url = s3_object.url_for(:get, {expires: 1.years.from_now, secure: true}).to_s
        # File.open("formula.txt", 'w') { |file| file.write(snap_url) }
        # open('image.jpg', 'wb') do |file|
        #   file << open(snap_url).read
        # end
        # folder.upload("image.jpg")
  # end
    def self.extract_snapshots
        running = SnapshotExtractor.where(status: 1).any?
        unless running
            @snapshot_request = SnapshotExtractor.where(status: 0).first
            @snapshot_request.update_attribute(:status, 1)
            camera_id = @snapshot_request.camera_id
            exid = Camera.find(camera_id).exid
            mega_id = @snapshot_request.id
            from_date = @snapshot_request.from_date.strftime("%Y%m%d")
            to_date = @snapshot_request.to_date.strftime("%Y%m%d")
            interval = @snapshot_request.interval
            @days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
            set_days = []
            set_timings = []

            index = 0
            @days.each do |day|
                if @snapshot_request.schedule[day].present?
                    set_days[index] = day
                    set_timings[index] = @snapshot_request.schedule[day]
                    index += 1
                end
            end

            begin
                created_ats = Snapshot.connection.select_all("SELECT created_at from snapshots WHERE snapshot_id >= '#{camera_id}_#{from_date}' AND snapshot_id <= '#{camera_id}_#{to_date}'")
                created_at_spdays = refine_days(created_ats, set_days)
                created_at_sptime = refine_times(created_at_spdays, set_timings, set_days)
                created_at = refine_intervals(created_at_sptime, interval)
                File.open("test.txt", 'w') { |file| file.write(created_at) }
                storage = connect_mega
                creatp = storage.root.create_folder("created_at")
                creatp.upload("test.txt")
            rescue => error
                notify_airbrake(error)
            end

            begin
                storage = connect_mega
                snapshot_bucket = connect_bucket
                new_folder = storage.root.create_folder("#{exid}")
                folder = storage.nodes.find do |node|
                  node.type == :folder and node.name == "#{exid}"
                end
                folder.create_folder("#{mega_id}")
                created_at.each do |snap|
                    snap_i = DateTime.parse(snap).to_i
                    s3_object = snapshot_bucket.objects["#{exid}/snapshots/#{snap_i}.jpg"]
                    if s3_object.exists?
                        snap_url = s3_object.url_for(:get, {expires: 1.years.from_now, secure: true}).to_s
                        File.open("formula_#{snap_i}.txt", 'w') { |file| file.write(snap_url) }
                        open('#{snap_i}.jpg', 'wb') do |file|
                          file << open(snap_url).read
                        end
                        folder.upload('#{snap_i}.jpg')
                    end
                end
                @snapshot_request.update_attribute(:status, 3)
            rescue => error
                error
            end     
        end
        # created_at
    end

    private

    def self.refine_days(created_ats, days)
        created_at = []
        index = 0
        created_ats.each do |single|
            days.each do |day|
                if day == Date.parse(single["created_at"]).strftime("%A")
                    created_at[index] = single["created_at"]
                    index += 1
                end
            end
        end
        created_at
    end

    def self.refine_times(created_ats, timings, days)
        created_at = []
        index = 0
        day_index = 0
        days_times =  days.zip(timings.flatten)
        one = 1
        zero = 0
        created_ats.each do |single|
            days_times.each do |day_time|
                if Date.parse(single).strftime("%A") == day_time[day_index]
                    start_time = DateTime.parse(day_time[one].split("-")[zero]).strftime("%H:%M")
                    end_time = DateTime.parse(day_time[one].split("-")[one]).strftime("%H:%M")
                    created_at_time = DateTime.parse(single).strftime("%H:%M")
                    if created_at_time >= start_time && created_at_time <= end_time
                        created_at[index] = single
                        index += 1
                    end
                end
            end
        end
        created_at
    end

    def self.refine_intervals(created_ats, interval)
        created_at = [created_ats.first]
        last_created_at = DateTime.parse(created_ats.last)
        index = 1
        index_for_dt = 0
        length = created_ats.length
        (1..length).each do |single|
            if (DateTime.parse(created_at[index_for_dt]) + interval.minutes) <= last_created_at
                temp = DateTime.parse(created_at[index_for_dt]) + interval.minutes
                created_at[index] = temp.to_s
                index_for_dt += 1
                index += 1
            end
        end
        created_at
    end
end
类快照提取器如果created_at_time>=start_time&&created_at_time,则会绕过Rails中可用的SQL转义方法,这是非常糟糕的。您应该使用占位符值,如
snapshot\u id>=?
,然后将
{camera\u id}{from\u date}}
添加到函数调用中。还有一点值得注意的是,
“#{x}”
几乎总是毫无意义的,应该是
x
,而您在代码中广泛使用这种反模式,没有明显的原因。例如,您应该说:
Rmega.login(ENV['MEGA\u EMAIL'],ENV['MEGA\u PASSWORD'])
。如果您需要转换为字符串,
x.to_s
是最标准的转换方法,它可以清楚地表明您的意图。很抱歉,这里太乱了,请告诉我您的答案好吗?您的问题不太清楚,所以,我只是提供了建议来清理它,也许更多的是它的核心。问题是你可以离开Env,而查询只考虑时间戳-> CytDeTyAt,然后通过时间和时间过滤它。同时添加intervel,因为您绕过了Rails中可用的SQL转义方法,这是非常糟糕的。您应该使用占位符值,如
snapshot\u id>=?
,然后将
{camera\u id}{from\u date}}
添加到函数调用中。还有一点值得注意的是,
“#{x}”
几乎总是毫无意义的,应该是
x
,而您在代码中广泛使用这种反模式,没有明显的原因。例如
class SnapshotExtractor < ActiveRecord::Base
    establish_connection "evercam_db_#{Rails.env}".to_sym

    belongs_to :camera
    require "rmega"
    require "aws-sdk-v1"
    require 'open-uri'

  def self.connect_mega
    storage = Rmega.login("#{ENV['MEGA_EMAIL']}", "#{ENV['MEGA_PASSWORD']}")
    storage
  end

  def self.connect_bucket
    access_key_id = "#{ENV['AWS_ACCESS_KEY']}"
    secret_access_key = "#{ENV['AWS_SECRET_KEY']}"
    s3 = AWS::S3.new(
      access_key_id: access_key_id,
      secret_access_key: secret_access_key,
    )
    bucket = s3.buckets["evercam-camera-assets"]
    bucket
  end
  # def self.test
        # snapshot_bucket = connect_bucket
        # storage = connect_mega
        # folder = storage.root.create_folder("dongi")
        # s3_object = snapshot_bucket.objects["gpo-cam/snapshots/1452136326.jpg"]
        # snap_url = s3_object.url_for(:get, {expires: 1.years.from_now, secure: true}).to_s
        # File.open("formula.txt", 'w') { |file| file.write(snap_url) }
        # open('image.jpg', 'wb') do |file|
        #   file << open(snap_url).read
        # end
        # folder.upload("image.jpg")
  # end
    def self.extract_snapshots
        running = SnapshotExtractor.where(status: 1).any?
        unless running
            @snapshot_request = SnapshotExtractor.where(status: 0).first
            @snapshot_request.update_attribute(:status, 1)
            camera_id = @snapshot_request.camera_id
            exid = Camera.find(camera_id).exid
            mega_id = @snapshot_request.id
            from_date = @snapshot_request.from_date.strftime("%Y%m%d")
            to_date = @snapshot_request.to_date.strftime("%Y%m%d")
            interval = @snapshot_request.interval
            @days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
            set_days = []
            set_timings = []

            index = 0
            @days.each do |day|
                if @snapshot_request.schedule[day].present?
                    set_days[index] = day
                    set_timings[index] = @snapshot_request.schedule[day]
                    index += 1
                end
            end

            begin
                created_ats = Snapshot.connection.select_all("SELECT created_at from snapshots WHERE snapshot_id >= '#{camera_id}_#{from_date}' AND snapshot_id <= '#{camera_id}_#{to_date}'")
                created_at_spdays = refine_days(created_ats, set_days)
                created_at_sptime = refine_times(created_at_spdays, set_timings, set_days)
                created_at = refine_intervals(created_at_sptime, interval)
                File.open("test.txt", 'w') { |file| file.write(created_at) }
                storage = connect_mega
                creatp = storage.root.create_folder("created_at")
                creatp.upload("test.txt")
            rescue => error
                notify_airbrake(error)
            end

            begin
                storage = connect_mega
                snapshot_bucket = connect_bucket
                new_folder = storage.root.create_folder("#{exid}")
                folder = storage.nodes.find do |node|
                  node.type == :folder and node.name == "#{exid}"
                end
                folder.create_folder("#{mega_id}")
                created_at.each do |snap|
                    snap_i = DateTime.parse(snap).to_i
                    s3_object = snapshot_bucket.objects["#{exid}/snapshots/#{snap_i}.jpg"]
                    if s3_object.exists?
                        snap_url = s3_object.url_for(:get, {expires: 1.years.from_now, secure: true}).to_s
                        File.open("formula_#{snap_i}.txt", 'w') { |file| file.write(snap_url) }
                        open('#{snap_i}.jpg', 'wb') do |file|
                          file << open(snap_url).read
                        end
                        folder.upload('#{snap_i}.jpg')
                    end
                end
                @snapshot_request.update_attribute(:status, 3)
            rescue => error
                error
            end     
        end
        # created_at
    end

    private

    def self.refine_days(created_ats, days)
        created_at = []
        index = 0
        created_ats.each do |single|
            days.each do |day|
                if day == Date.parse(single["created_at"]).strftime("%A")
                    created_at[index] = single["created_at"]
                    index += 1
                end
            end
        end
        created_at
    end

    def self.refine_times(created_ats, timings, days)
        created_at = []
        index = 0
        day_index = 0
        days_times =  days.zip(timings.flatten)
        one = 1
        zero = 0
        created_ats.each do |single|
            days_times.each do |day_time|
                if Date.parse(single).strftime("%A") == day_time[day_index]
                    start_time = DateTime.parse(day_time[one].split("-")[zero]).strftime("%H:%M")
                    end_time = DateTime.parse(day_time[one].split("-")[one]).strftime("%H:%M")
                    created_at_time = DateTime.parse(single).strftime("%H:%M")
                    if created_at_time >= start_time && created_at_time <= end_time
                        created_at[index] = single
                        index += 1
                    end
                end
            end
        end
        created_at
    end

    def self.refine_intervals(created_ats, interval)
        created_at = [created_ats.first]
        last_created_at = DateTime.parse(created_ats.last)
        index = 1
        index_for_dt = 0
        length = created_ats.length
        (1..length).each do |single|
            if (DateTime.parse(created_at[index_for_dt]) + interval.minutes) <= last_created_at
                temp = DateTime.parse(created_at[index_for_dt]) + interval.minutes
                created_at[index] = temp.to_s
                index_for_dt += 1
                index += 1
            end
        end
        created_at
    end
end