Ruby on rails 将数组添加到活动记录对象
假设我有一个类似于以下内容的活动#show action:Ruby on rails 将数组添加到活动记录对象,ruby-on-rails,ruby,activerecord,rails-activerecord,Ruby On Rails,Ruby,Activerecord,Rails Activerecord,假设我有一个类似于以下内容的活动#show action: def show @campaign = Campaign.find(params[:id]) end 假设,我想在我的视图中显示我从YouTube API中获得的一些信息,这些信息是用变量编写的,所以Campaign#show现在看起来像这样: def show @campaign = Campaign.find(params[:id]) @views = Campaign.youtube_info(@campai
def show
@campaign = Campaign.find(params[:id])
end
假设,我想在我的视图中显示我从YouTube API中获得的一些信息,这些信息是用变量编写的,所以Campaign#show现在看起来像这样:
def show
@campaign = Campaign.find(params[:id])
@views = Campaign.youtube_info(@campaign.url) # this class method of Campaign
end
但是为了方便起见,我想合并@campaign和@views,并在@campaign中有类似的@campaign[:views][:view\u count]
据我所知,@campaing是ActiveRecord对象,@views是散列,不允许进行这种合并
在这种情况下,最好的方法是什么
提前感谢。首先,作为普通Rails应用程序的一部分,您将向视图传递任意数量的对象。使用
@views
和@campaign
一点问题都没有
然而,在你的情况下,事情写得很奇怪
首先,views
应该是Campaign
上的一个方法,它应该只调用youtube\u info
奇怪的是,youtube\u info
是类级方法,因为它需要从类的实例输入属性。它应该是一个实例方法,您只需在视图中调用该方法即可
如果要防止每次调用都对API进行额外调用,请缓存第一次调用的结果。“缓存”方法返回值的过程称为“记忆化”,您可以在Ruby世界中找到很多关于它的文章。以下是Ruby中非常常见的模式:
class Campaign < ActiveRecord::Base
def youtube_info
@youtube_info ||= perform_some_api_request(@url)
end
def views
youtube_info['views']
end
end
但是,第一个例子更好。没有理由将youtube\u info作为类级方法
class Campaign < ActiveRecord::Base
def self.youtube_info(url)
# ...
end
def views
@views ||= Campaign.youtube_info(@url)['views']
end
end