如何将属性/属性添加到数组中的每个记录/对象?轨道

时间:2017-07-13 22:47:52

标签: ruby-on-rails arrays

我不确定这只是缺少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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果NewsStory模型(或其名称)与belongs_toUser的关系,那么您不必执行任何操作。您可以直接访问相关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

几个笔记。

  1. 我使用find代替wherefind返回由其主键(id)标识的单个记录; where返回一个记录数组。肯定有更有效的方法来做到这一点 - eager-loading,一个 - 但是因为你刚刚开始,我认为在你深入研究先进的东西之前学习基础知识更重要高性能的。

  2. 我已经摆脱了pluck来电,因为在这里,您只是在学习,而pluck是一种在您处理大量数据时非常有用的性能优化如果这就是你正在做的事情,那么activerecord有batch api你应该研究。

  3. 我已将@user_for_record更改为user_for_record@表示ruby中的实例变量。实例变量是可以从类的实例中的任何实例方法共享和访问的。在这种情况下,您只需要一个局部变量。