如何在 Rails 上修改 Ruby 中的 ActiveRecord_Relation 输出

How to modify ActiveRecord_Relation output in Ruby on Rails

我有一个 Post 模型与 gem Acts_as_Taggable_on 相结合。

我想显示所有帖子及其所有标签,但标签应按使用次数排序(使用特定标签标记的帖子数)。

为此,我遍历了 ActiveRecord_Relation 并对标签列进行了排序:

def index
  temp_posts = Post.all.order('updated_at DESC')
  temp_posts.each_with_index do |temp_post, index|
    temp_posts[index].tags = temp_post.tags.sort_by {|tag| -tag.taggings_count}
  end
  @show = temp_posts.first.tags.sort_by {|tag| -tag.taggings_count} # according to this control output it should work
  @posts = temp_posts
end

查看控制输出@show 时,标签按要求排序,但未保存到temp_posts 变量中。因此输出未排序。

我可以如何处理 'save' 我在循环中所做的更改?

因为你有Tag#taggings_count,你可以通过它来排序你的协会。我不知道这是否会与 ActsAsTaggable 所做的冲突,但这就是原版 Rails 中的样子。也许 ActsAsTaggable 有一些选择可以完成同样的事情。

class Post < ActiveRecord::Base
  has_many :taggings
  has_many :tags, through: :taggings, -> { order(taggings_count: :desc) }
end

有关详细信息,请参阅 Scopes for has_many


如果您不想在全局范围内应用该顺序, 是一个不错的选择。编写一个 Post#sorted_tags 方法,您可以在需要时在 Post 上访问它。将其记忆到实例变量中将防止额外的数据库查询。

class Post < ActiveRecord::Base
  def sorted_tags
    @sorted_tags ||= tags.sort_by(&:taggings_count).reverse
  end
end

问题最终只出现在使用无效变量保存排序标签时。

Acts as Taggable on 使用变量 tag_list 来存储与 Tag 模型关联的标签。相反,我错误地使用了变量 tags

我的代码的完整正确版本:

def index
  temp_posts = Post.all.order('updated_at DESC')
  temp_posts.each_with_index do |temp_post, index|
    // CHANGE: temp_posts[index].tags => temp_posts[index].tag_list
    temp_posts[index].tag_list = temp_post.tags.sort_by {|tag| -tag.taggings_count}
  end
  @posts = temp_posts
end