Ruby on rails 为什么可以';我不能在模型中使用排序方式吗?

Ruby on rails 为什么可以';我不能在模型中使用排序方式吗?,ruby-on-rails,Ruby On Rails,我有一个用户模型和一个出价模型。我希望用户知道他们的排名是基于存储为方法的分数,即基于user.scoremethod的“3/7”。目前,我正试图将这个geek_rank方法塞进Bid模型中,如下所示: def user_rank(my_id) #Finds all bids associated with parent ticket object bids = Bid.find_by_ticket_id(self.ticket.id) bids = bids.sort_by { |

我有一个用户模型和一个出价模型。我希望用户知道他们的排名是基于存储为方法的分数,即基于
user.score
method的“3/7”。目前,我正试图将这个
geek_rank
方法塞进
Bid
模型中,如下所示:

def user_rank(my_id)
  #Finds all bids associated with parent ticket object
  bids = Bid.find_by_ticket_id(self.ticket.id)
  bids = bids.sort_by { |b| b.user.score}
  i = 0
  for b in bids
    i += 1
    if b.user_id.to_i == my_id.to_i
      myrank = i
    end
  end
  user_rank = myrank.to_s + "/" + i.to_s
end
出于某种原因,sort_by方法在控制器中有效,但在我尝试在模型中进行排序时无效。有人能告诉我我的代码有什么问题吗?:)

澄清:


我得到的实际错误是一个方法缺失错误。

那么,该方法返回的分数是有理数,如3/7,还是固定数

如果它们是有理数,则应能够通过可枚举排序方法进行比较:

ruby-1.8.7-p299 > require 'mathn'
 => true 
ruby-1.8.7-p299 > Rational
 => Rational 
ruby-1.8.7-p299 > Rational(3/7)
 => 3/7 
ruby-1.8.7-p299 > Rational(3/7) <=> Rational(5/7)
 => -1 
ruby-1.8.7-p299>需要“mathn”
=>正确
ruby-1.8.7-p299>Rational
=>理性
ruby-1.8.7-p299>Rational(3/7)
=> 3/7 
ruby-1.8.7-p299>Rational(3/7)Rational(5/7)
=> -1 
但是如果它们被计算为fixnums,那么3/7返回零,ruby不能将0与0进行比较(整数除法)

ruby-1.8.7-p299>3/7
=> 0 
ruby-1.8.7-p299>5/7
=> 0 
ruby-1.8.7-p299>3/7 5/7
=> 0 
ruby-1.8.7-p299>5/7 5/7
=> 0 
ruby-1.8.7-p299>8/7 5/7
=> 1 
ruby-1.8.7-p299>7/7/7
=> 0 

那么,该方法返回的分数是有理数,如3/7还是固定数

如果它们是有理数,则应能够通过可枚举排序方法进行比较:

ruby-1.8.7-p299 > require 'mathn'
 => true 
ruby-1.8.7-p299 > Rational
 => Rational 
ruby-1.8.7-p299 > Rational(3/7)
 => 3/7 
ruby-1.8.7-p299 > Rational(3/7) <=> Rational(5/7)
 => -1 
ruby-1.8.7-p299>需要“mathn”
=>正确
ruby-1.8.7-p299>Rational
=>理性
ruby-1.8.7-p299>Rational(3/7)
=> 3/7 
ruby-1.8.7-p299>Rational(3/7)Rational(5/7)
=> -1 
但是如果它们被计算为fixnums,那么3/7返回零,ruby不能将0与0进行比较(整数除法)

ruby-1.8.7-p299>3/7
=> 0 
ruby-1.8.7-p299>5/7
=> 0 
ruby-1.8.7-p299>3/7 5/7
=> 0 
ruby-1.8.7-p299>5/7 5/7
=> 0 
ruby-1.8.7-p299>8/7 5/7
=> 1 
ruby-1.8.7-p299>7/7/7
=> 0 

方法
通过票据id查找票据id
不返回数组;它返回一个出价。 使用
find\u all\u by\u ticket\u id

bids = Bid.find_all_by_ticket_id(self.ticket.id)
bids = bids.sort_by { |b| b.user.score}
我会将你的方法改写如下:

def user_rank(my_id)
  # find the bid by the given id
  score = Bid.find_by_id(my_id).user.score

  # find the total number of bids for the ticket
  count  = Bid.count(:conditions => {:ticket_id => self.ticket.id})

  # find the rank
  rank   = Bid.count(:conditions => ["ticket_id =? AND users.score > ? ",
              self.ticket.id, score], :joins => :user) + 1
  "#{rank}/#{count}"
end
在这种方法中,大多数计算由DB完成

警告1

此方法将为得分相同的人返回相同的排名

例如:

警告2

此解决方案的性能优于您的解决方案。但计算排名仍然需要n*3次往返服务器。可以进一步优化解决方案,以计算一个SQL中所有用户的排名

关于排名计算优化的文章:


方法
按票证id查找\u
不返回数组;它返回一个出价。 使用
find\u all\u by\u ticket\u id

bids = Bid.find_all_by_ticket_id(self.ticket.id)
bids = bids.sort_by { |b| b.user.score}
我会将你的方法改写如下:

def user_rank(my_id)
  # find the bid by the given id
  score = Bid.find_by_id(my_id).user.score

  # find the total number of bids for the ticket
  count  = Bid.count(:conditions => {:ticket_id => self.ticket.id})

  # find the rank
  rank   = Bid.count(:conditions => ["ticket_id =? AND users.score > ? ",
              self.ticket.id, score], :joins => :user) + 1
  "#{rank}/#{count}"
end
在这种方法中,大多数计算由DB完成

警告1

此方法将为得分相同的人返回相同的排名

例如:

警告2

此解决方案的性能优于您的解决方案。但计算排名仍然需要n*3次往返服务器。可以进一步优化解决方案,以计算一个SQL中所有用户的排名

关于排名计算优化的文章:


我收到一个方法缺失错误,表示没有排序方式。如果您收到的是无方法错误,那么您的bids分配返回的不是实现可枚举的数据结构。你能在bids sort调用之前放一个trace语句吗,(STDERR.puts bids.insect)我得到了一个方法缺失错误,说没有sort_by之类的东西如果你得到了一个无方法错误,那么从bids赋值返回的不是一个实现可枚举的数据结构。你能在你的出价排序调用之前放一个跟踪语句吗,(STDERR.puts bids.inpart)Find_all_by_ticket_id应该是票证+1对此答案,按票证查找所有票证id应为票证+我对这一答案表示怀疑