我不确定这只是缺少Rails语言,还是我在Stack Overflow上搜索所有错误的内容,但我无法找到如何在每个记录中添加属性阵列。
以下是我尝试做的一个例子:
@news_stories.each do |individual_news_story|
@user_for_record = User.where(:id => individual_news_story[:user_id]).pluck('name', 'profile_image_url');
individual_news_story.attributes(:author_name) = @user_for_record[0][0]
individual_news_story.attributes(:author_avatar) = @user_for_record[0][1]
end
有什么想法吗?
答案 0 :(得分:1)
如果NewsStory
模型(或其名称)与belongs_to
有User
的关系,那么您不必执行任何操作。您可以直接访问相关User
的属性:
@news_stories.each do |news_story|
news_story.user.name # gives you the name of the associated user
news_story.user.profile_image_url # same for the avatar
end
要避免使用N+1 query,您可以使用includes
查询中的NewsStory
一次为每个新闻报道预加载关联的用户记录:
NewsStory.includes(:user)... # rest of the query
如果你这样做,你将不需要@user_for_record
查询--Rails将为你做繁重的工作,你甚至可以看到性能提升,这要归功于不发布单独的pluck
查询集合中的每个新闻故事。
如果你需要在那里拥有那些额外的属性:
您可以在NewsStory
查询中选择它们作为额外属性:
NewsStory.
includes(:user).
joins(:user).
select([
NewsStory.arel_table[Arel.star],
User.arel_table[:name].as("author_name"),
User.arel_table[:profile_image_url].as("author_avatar"),
]).
where(...) # rest of the query
答案 1 :(得分:0)
看起来你正试图在NewsStory模型上缓存用户的名字和头像,在这种情况下,你想要的是:
@news_stories.each do |individual_news_story|
user_for_record = User.find(individual_news_story.user_id)
individual_news_story.author_name = user_for_record.name
individual_news_story.author_avatar = user_for_record.profile_image_url
end
几个笔记。
我使用find
代替where
。 find
返回由其主键(id)标识的单个记录; where返回一个记录数组。肯定有更有效的方法来做到这一点 - eager-loading,一个 - 但是因为你刚刚开始,我认为在你深入研究先进的东西之前学习基础知识更重要高性能的。
我已经摆脱了pluck
来电,因为在这里,您只是在学习,而pluck
是一种在您处理大量数据时非常有用的性能优化如果这就是你正在做的事情,那么activerecord有batch api你应该研究。
我已将@user_for_record
更改为user_for_record
。 @
表示ruby中的实例变量。实例变量是可以从类的实例中的任何实例方法共享和访问的。在这种情况下,您只需要一个局部变量。