Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 在与持久化数据相同的列表中显示未持久化数据_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 在与持久化数据相同的列表中显示未持久化数据

Ruby on rails 在与持久化数据相同的列表中显示未持久化数据,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有两个数据源:我的数据库和第三方API。第三方API是“真相的来源”,但我希望用户能够从第三方API“书签”一个项目,然后将其保存在我的数据库中 我面临的挑战是在同一个列表中显示两组项s,而不会太复杂。下面是一个例子: 项目1(未添加书签,来自第三方API) 项目2(已添加书签,在本地保留) 项目3(已添加书签,在本地保留) 第4项(未添加书签,来自第三方API) …等等 我希望视图从控制器中获取所有项的列表,并且不知道项的来源,但应该只知道每个项是否已添加书签以便显示(例如,用户可以将未

我有两个数据源:我的数据库和第三方API。第三方API是“真相的来源”,但我希望用户能够从第三方API“书签”一个
项目
,然后将其保存在我的数据库中

我面临的挑战是在同一个列表中显示两组
s,而不会太复杂。下面是一个例子:

  • 项目1(未添加书签,来自第三方API)
  • 项目2(已添加书签,在本地保留)
  • 项目3(已添加书签,在本地保留)
  • 第4项(未添加书签,来自第三方API)
…等等

我希望视图从控制器中获取所有
项的列表,并且不知道
项的来源,但应该只知道每个
项是否已添加书签以便显示(例如,用户可以将未标记的
项标记为书签)


在其他语言中,泛型是解决这个问题的一种方法,但遗憾的是,Ruby没有泛型(没有抱怨)。在Ruby/Rails中,包装/构造这些模型的最佳方式是什么,这样视图就只需要考虑一种类型的
项了(实际上幕后有两种类型?

我建议使用一个对象,负责从第三方API和数据库中获取项,这种操作的结果将是一组响应相同方法的项,无论它们来自何处

下面是一个我将如何进行的示例:

class ItemsController < ApplicationController
  def index
    @items = ItemRepository.all
  end
end
拼图的最后一块是
ResultItem
,记住
ItemRepository。所有的
都将返回一个包含这种类型对象的数组,因此您需要做的就是存储视图需要的来自此类上每个项的信息

在本例中,我假设视图需要知道的关于每个项目的所有信息都是它的名称以及它是否已被书签,因此
ResultItem
响应
书签?
name
方法:

class ResultItem
  attr_reader :name

  def initialize(name:, bookmarked:)
    @name = name
    @bookmarked = bookmarked
  end

  def bookmarked?
    !!@bookmarked
  end
end
我希望这有帮助:)


另外,如果有些类名过于通用,我想不出更好的方法了

你是在问应该如何定义模型和关联吗?或者您已经有了一些模型,只想获取数据并将其与第三方数据合并?如果您为每个源的数据都有一个数组,那么您可以只合并这些数组。也许您应该展示您正在使用的特定数据结构,以获得更详细的建议。这里唯一关心的是,我假设这会生成书签项目的副本,其中一个是图书标记的(本地),另一个不是(第三方)。我认为需要某种形式的重复数据消除,这是一个伟大的观点!如果API在查询时接受一些参数,也许您可以过滤掉本地存储的结果,如果不接受,我想您可以尝试手动丢弃它们,作为
API\u items
方法的一部分
class ResultItem
  attr_reader :name

  def initialize(name:, bookmarked:)
    @name = name
    @bookmarked = bookmarked
  end

  def bookmarked?
    !!@bookmarked
  end
end