从URL请求Rails模型的一部分

时间:2019-03-09 16:16:41

标签: ruby-on-rails activerecord net-http

我有一个名为Tasks的Rails模型,它只有一个属性:resource_id。这是指另一个Rails网站上的Resource(另一个模型)的ID,该ID运行在具有不同数据库的不同URL上。

当您请求Resource(例如http://localhost:3020/resources/23.json)时,它将以JSON格式返回资源,例如:

{
  "title": "Hello",
  "description": "Lorem ipsum..."
}

我希望能够这样引用我当前的Rails网站(带有Task的网站)中所请求的资源:

# returns a Task with `resource_id: 23`
@task = Task.find(1)

# refers to the Resource from the other Rails server
@task.resource.title

如何使Rails从本地数据库中找到Resource的同时获取Task

我尝试在resource中创建一个task.rb属性,该属性在这样调用时会请求Resource

require 'net/http'

class Task < ApplicationRecord
  def resource
    res = Net::HTTP.get(URI.parse('http://localhost:3020/resources/' + resource_id.to_s + '.json'))
    JSON.parse(res)
  end
end

但是,这每次都会运行 ,我打电话给task.resource,这非常慢。我能否只请求一次Resource并将其存储在某种伪属性中(我不知道它叫什么)吗?

3 个答案:

答案 0 :(得分:1)

查询外部数据库表的所有内容不是很有效。但是您可以为控制器添加缓存:

例如,您可以将缓存与redis一起使用:

require 'net/http'

class Task < ApplicationRecord
  def resource
    res = $redis.fetch(:resource, expires_in: 1.hour) do
      Net::HTTP.get(URI.parse('http://localhost:3020/resources/' + resource_id.to_s + '.json'))
      JSON.parse(res)
    end
  end
end

答案 1 :(得分:0)

这是我解决自己问题的方式:

首先,将一个名为if a==2b && a1==2b1 && b==2a && b1==2a1 ( c==other ) &&( 2c=="infected" || 2c=='CNC") delete one that has message "other" 的字符串属性添加到Task

resource_string

task.rb

然后您可以按以下方式访问资源:

require 'net/http'

class Task < ApplicationRecord
  def resource
    JSON.parse(resource_string)
  end

  after_find do |task|
    task.resource_string = request_resource task
  end

  private

  def request_resource(task)
    Net::HTTP.get(URI.parse('http://localhost:3020/resources/' + task.resource_id.to_s + '.json'))
  end
end

调用find方法后,它只会发出一次请求并将其写入@task = Task.find(1) @task.resource['title'] 属性。

答案 2 :(得分:-1)

您需要向“任务和资源”添加关联:

在task.rb中:

  has_many: :resources

在resource.rb中:

  belongs_to: :task

这些关联会自动将诸如资源方法之类的方法添加到模型中:https://guides.rubyonrails.org/association_basics.html

然后在控制器操作中,使用:includes连接两个表:

@tasks = Task.includes(:resource)

参见此处:https://apidock.com/rails/ActiveRecord/QueryMethods/includes

,并在此处进行解释:https://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations