更改to_param时的上一个和下一个链接

时间:2014-10-02 10:54:31

标签: ruby-on-rails ruby ruby-on-rails-4

我正在创建下一个和上一个链接,但由于我通过修改to_param方法改变了我的网址外观的方式而遇到了麻烦

 def slug
  name.downcase.gsub(" ", "-")  
 end

 # URL will now show /id-name
 def to_param
  "#{self.id}-#{slug}"
 end

所以我获取上一个链接的方法看起来像

def previous_animal
 self.class.first(:conditions => ["id-name < ?", "what-to-put-here"], :order => "created_at desc")
end

我认为如果我只是使用id就是

def previous_animal
 self.class.first(:conditions => ["id < ?", id], :order => "created_at desc")
end

我如何传递新的id格式?

任何帮助表示赞赏

修改

正如D-side所指出的,数据库查找没有改变,因此在尝试以下操作时我收到错误

def previous_animal
 self.class.first(:conditions => ["id < ?", id], :order => "created_at desc")
end

查看

<%= link_to(@animal.previous_animal) %>

错误

invalid value for Integer(): "{:conditions=>[\"id < ?\""

所以link_to期待一个整数,但传递的内容看起来像这样

{"id"=>"27-clawd"}

2 个答案:

答案 0 :(得分:2)

您已将其标记为rails 4,但似乎使用了rails 2语法。

这有用吗?

def previous_animal
  self.class.where("id < ?", id).order(created_at: :desc).first
end

答案 1 :(得分:1)

您依赖于idcreated_at同步,即假设在另一个模型之后创建的模型将始终具有更高的ID。它通常是正确的,但取决于数据库和风险假设(例如,可以手动更改ID或created_at)。

所以我会这样做:

def previous_animal
  animal = self.class.order('created_at desc').where('created_at < ?', self.created_at)
  animal.first if animal
end