Ruby on rails 如何在RubyonRails中获得5篇最受欢迎的文章

Ruby on rails 如何在RubyonRails中获得5篇最受欢迎的文章,ruby-on-rails,Ruby On Rails,我需要得到5个用户浏览最多的文章。为此,我实现了“impression”功能,并且文章和impression模型之间存在多态关系。使用此功能,我无法从用户那里获得每篇文章的任何视图。但现在我需要从数据库中获取5篇浏览量最大的文章。我知道这是个愚蠢的问题,但我试过了,却找不到答案 schema.rb(我没有粘贴完整的文件,只是相关的) 文章\u controller.rb class ArticlesController < ApplicationController before_fi

我需要得到5个用户浏览最多的文章。为此,我实现了“impression”功能,并且文章和impression模型之间存在多态关系。使用此功能,我无法从用户那里获得每篇文章的任何视图。但现在我需要从数据库中获取5篇浏览量最大的文章。我知道这是个愚蠢的问题,但我试过了,却找不到答案

schema.rb(我没有粘贴完整的文件,只是相关的)

文章\u controller.rb

class ArticlesController < ApplicationController
  before_filter :is_user_admin, only: [:new, :create, :edit, :destroy]
  before_filter :log_impression, :only=> [:show]

    def is_user_admin
      redirect_to(action: :index) unless current_user.try(:is_admin?) 
      return false 
    end

   def log_impression
     @article = Article.find(params[:id])
     # this assumes you have a current_user method in your authentication system
      @article.impressions.create(ip_address: request.remote_ip,user_id:current_user.id)
   end

      def index
          @articles = Article.all(:order => "created_at DESC")
      @article_titles = Article.first(10)
      @article_popular = Article. 
      @tags = Tag.all
      end

    def show
       @article = Article.find(params[:id])
       @related_articles = Article.joins(:taggings).
       where('articles.id != ?', @article.id)
       .where(taggings: { tag_id: @article.tag_ids }) 
    end

      def new
      @article = Article.new
      end

    def create
      @article = Article.new(params[:article])
      @article.user_id = current_user.id
      if @article.save
        flash[:success] = "article created!"
        redirect_to article_path(@article)
      else
        render 'new' 
      end 
    end

    def destroy
      @article = Article.find(params[:id])
      @article.destroy
      redirect_to action:  'index'  
    end

    def edit
      @article = Article.find(params[:id])
    end

    def update
      @article = Article.find(params[:id])
      if @article.update_attributes(params[:article])
       flash.notice = "Article '#{@article.title}' Updated!"
       redirect_to article_path(@article)
      else 
        render 'edit'
      end
    end
end
class-ArticlesController[:show]
def是用户管理员
除非是当前用户,否则重定向到(操作::索引)。try(:is_admin?)
返回错误
结束
def log_印模
@article=article.find(参数[:id])
#这假设您在身份验证系统中有当前的用户方法
@article.impressions.create(ip地址:request.remote\u ip,用户id:current\u user.id)
结束
def索引
@articles=Article.all(:order=>“在DESC创建”)
@文章标题=第一篇文章(10)
@文章流行。
@tags=Tag.all
结束
def秀
@article=article.find(参数[:id])
@相关文章=文章连接(:标记)。
其中('articles.id!=?',@article.id)
.where(标记:{tag_id:@article.tag_id})
结束
def新
@article=article.new
结束
def创建
@article=article.new(参数[:article])
@article.user\u id=当前的\u user.id
如果@article.save
flash[:success]=“文章已创建!”
重定向到文章路径(@article)
其他的
呈现“新”
结束
结束
def销毁
@article=article.find(参数[:id])
@第条销毁
将_重定向到操作:“索引”
结束
定义编辑
@article=article.find(参数[:id])
结束
def更新
@article=article.find(参数[:id])
如果@article.update_属性(参数[:article])
flash.notice=“文章“#{@Article.title}”已更新!”
重定向到文章路径(@article)
其他的
渲染“编辑”
结束
结束
结束
第1.rb条

class Article < ActiveRecord::Base
   attr_accessible :title, :body
   attr_accessible :tag_list
   has_many :comments
   belongs_to :user
   has_many :taggings
   has_many :tags, through: :taggings
   has_many :impressions, :as=>:impressionable
   validates :title, :body, :tag_list,  :presence => true

  def impression_count
    impressions.size
  end

  def unique_impression_count
    impressions.group(:ip_address).size #UNTESTED: might not be correct syntax
  end


   def tag_list
     self.tags.collect do |tag|
      tag.name
     end.join(", ")
   end

   def tag_list=(tags_string)
     tag_names = tags_string.split(",").collect{|s| s.strip.downcase}.uniq
     new_or_found_tags = tag_names.collect { |name| Tag.find_or_create_by_name(name) }
     self.tags = new_or_found_tags
   end
end
类文章:易受影响
验证:title、:body、:tag_list、:presence=>true
def/U计数
尺寸
结束
def唯一\u印象\u计数
impressions.group(:ip#U地址)。大小#未测试:语法可能不正确
结束
def标签列表
self.tags.collect do | tag|
tag.name
结束。连接(“,”)
结束
def标记列表=(标记字符串)
tag_names=tags_string.split(“,”).collect{s | s.strip.downcase}.uniq
new_或_found_tags=tag_names.collect{| name | tag.find_或_create_by_name(name)}
self.tags=新的或找到的标签
结束
结束
impression.rb

class Impression < ActiveRecord::Base
  attr_accessible :impressionable_id, :impressionable_type, :ip_address, :user_id
  belongs_to :impressionable, :polymorphic=>true 
end
类印象true
结束
articles/show.html.erb

Viewed: <%=@article.impression_count %> times
查看次数:次
这就是我计算用户视图数量的方法。现在我想得到5篇用户浏览量最大的文章。 任何帮助都将不胜感激。有关更多信息,我已使用()获取用户视图。

您是否尝试过:

impressions = Impression.select("impressionable_id, count(*) as qty").where("impressionable_type = ?", 'Article').group('impressionable_type, impresionable_id').order('qty desc').limit(5)
Article.joins(:impressions).where(impressions: {impresionable_id: impressions.map(&:impressionable_id)})
您是否尝试过:

impressions = Impression.select("impressionable_id, count(*) as qty").where("impressionable_type = ?", 'Article').group('impressionable_type, impresionable_id').order('qty desc').limit(5)
Article.joins(:impressions).where(impressions: {impresionable_id: impressions.map(&:impressionable_id)})

为了避免ruby对象的映射,我认为最好的方法是使用:

在您的模型中:

class Article < AR
  has_many :impressions, as: :impressionable
  has_many :comments
end

class Comment < AR
  belongs_to :article
  has_many :impressions, as: :impressionable
end

class Impression < AR
  # the counter cache here is the important option
  belongs_to :impressionable, polymorphic: true, counter_cache: :impressions_count
end
分别

Comment.order('comments.impressions_count DESC').limit(5)

当然,你也可以做文章。印象也很重要…

我认为最好的方法是使用:

在您的模型中:

class Article < AR
  has_many :impressions, as: :impressionable
  has_many :comments
end

class Comment < AR
  belongs_to :article
  has_many :impressions, as: :impressionable
end

class Impression < AR
  # the counter cache here is the important option
  belongs_to :impressionable, polymorphic: true, counter_cache: :impressions_count
end
分别

Comment.order('comments.impressions_count DESC').limit(5)

当然你也可以写
@文章。印象也很重要…

嗨,罗拉,谢谢你的回复。将此连接查询写在articles_controller.rb或其他地方。如果是在articles_controller.rb中,那么如何在视图中访问。我需要把它放在impression.rb(model)中吗。任何建议。\@articles=Article.joins(:impressions).where(impressions:{impressionable\u id:impressions.map(&:impressionable\u id))您可以在任何零件、控制器、视图等上写它,只要您有权访问模型。嗨,rorra,当我试图在articles\u controller.rb/show action中实现您的建议时,我收到以下错误:-ActiveRecord::Statement在ArticlesController#show SQLite3::SQLException中无效:没有这样的列:不可更改的\u id:选择可更改的\u id,从“impressions”中计算(*)数量,其中(可更改的\u类型='Article')按可更改的\u类型分组,不可更改的\u id按数量顺序描述限制5。它说“ArticlesController#show中的语句无效”。任何建议。这只是小组条款中的一个拼写错误<代码>易受影响的id
是的,我更改了打字错误。你的建议不知怎么起作用了,但它给了我很多文章。假设一篇文章被浏览了10次,它显示该文章10次,而不是只显示该文章一次。这就是我在视图中使用它的方式:-。嗨,罗拉,谢谢你的回复。将此连接查询写在articles_controller.rb或其他地方。如果是在articles_controller.rb中,那么如何在视图中访问。我需要把它放在impression.rb(model)中吗。任何建议。\@articles=Article.joins(:impressions).where(impressions:{impressionable\u id:impressions.map(&:impressionable\u id))您可以在任何零件、控制器、视图等上写它,只要您有权访问模型。嗨,rorra,当我试图在articles\u controller.rb/show action中实现您的建议时,我收到以下错误:-ActiveRecord::StatementInvalid in ArticlesController#show SQLite3::SQLException:没有这样的列:不可更改的\u id:选择可更改的\u id,计数