2014-10-02 60 views
1

我希望有人能幫助我/指出我在正確的方向與以下。通過特定的屬性類型鏈接到上一個/下一個記錄

我有一個動物模型,它目前由貓和狗組成。我有一欄叫animal_type將定義的動物是什麼

當我查看記錄(show動作),那麼它可以是任何動物類型,接下來我已經建立,並通過所有的動物記錄以前的鏈接循環

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

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

控制器

def show 
@animal = Animal.find(params[:id]) 
end 

查看

<% if @animal.previous_animal %> 
    <%= link_to(@animal.previous_animal, {class: 'prev-page'}) do %> 
    <span class="glyphicon glyphicon-chevron-left"></span> Meet <span class="name"><%= @animal.previous_animal.name %></span>, the <%= animal_breed(@animal.previous_animal) %> 
    <% end %> 
<% end %> 

因此,如果我正在看狗,我需要做什麼才能說只能通過下一個和以前的狗,而不包括任何貓,反之亦然,所以如果我看貓記錄,只有循環通過其他貓..

林有點卡住關於如何實現..伊夫想過一個範圍

scope :dog_type, -> { where(animal_type: 'Dog') } 

,但仍不能確定如何落實

任何幫助讚賞

感謝

回答

1

你可以做到以下幾點:

# model 
def previous_animal 
    self.class.order('created_at desc').where('created_at < ?', self.created_at).where(animal_type: self.animal_type).first 
end 

# view 
<% if previous_animal = @animal.previous_animal %> # local assignment in the if condition 
    <%= link_to(previous_animal, {class: 'prev-page'}) do %> 
    <span class="glyphicon glyphicon-chevron-left"></span> Meet <span class="name"><%= previous_animal.name %></span>, the <%= animal_breed(previous_animal) %> 
    <% end %> 
<% end %> 
  • previous_animal方法簡單,呼籲.first上一個ActiveRecord ::關係不能失敗,但它可以返回nil
  • 我在if條件中使用了局部變量賦值,因爲每次在記錄上調用previous_animal它都會觸發SQL查詢。這種局部變量類似於緩存(不會多次觸發SQL查詢)。
+0

謝謝MrYoshiji,任何區別在兩個答案之間的表現? – Richlewis 2014-10-02 14:55:34

+0

是的,我只是用參數更新了我的答案。 – MrYoshiji 2014-10-02 14:56:35

+0

謝謝你這是一個很好的解釋...因此,我可以分配給局部變量越多性能越好? – Richlewis 2014-10-02 14:58:32

1
def next_animal 
animal = self.class.order('created_at desc').where('created_at > ? and animal_type = ?', created_at, animal_type) 
animal.first if animal 
end 

只要將它添加到哪裏,如果你使用範圍,那麼你將需要在你的上一個和下一個if語句。

+0

你能稍微擴大答案嗎? – Richlewis 2014-10-02 14:49:35

+0

ah不用擔心,我明白你的意思了,如果我要使用範圍,那麼我將不得不使用if語句,將它添加到無需使用範圍的地方,謝謝 – Richlewis 2014-10-02 14:52:10

相關問題