如何在 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
我有一个 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