如何在模型中创建一个方法来合并两个date
,以便我可以在next_user_challenge
和previous_user_challenge
模型
def challenge_date
# deadline + date_started (some challenges have a deadline and others have date_started)
end
def next_user_challenge
user.challenges.where('challenge_date > ?', challenge_date).order('challenge_date ASC').first
end
def previous_user_challenge
user.challenges.where('challenge_date < ?', challenge_date).order('challenge_date ASC').last
end
查看
<% if @challenge.previous_user_challenge %>
<%= link_to 'Prev', challenge_path(@challenge.previous_user_challenge), class: "footer-left", style: "color: white; font-style: normal;" %>
<% else %>
<%= link_to 'Home', root_url, class: "footer-left" %>
<% end %>
<% if @challenge.next_user_challenge %>
<%= link_to 'Next', challenge_path(@challenge.next_user_challenge), class: "footer-right" %>
<% else %>
<%= link_to 'Home', root_url, class: "footer-right" %>
<% end %>
rails c
# some challenges will just have a deadline
id: 1,
name: "Publish a Novel",
deadline: Sat, 26 Nov 2016,
date_started: nil,
days_challenged: nil,
category: "goal",
user_id: 117,
# some challenges will just have a date_started
id: 2,
name: "Write a Chp",
deadline: nil,
date_started: Thu, 20 Oct 2016,
days_challenged: 10,
category: "habit",
user_id: 117,
# and some challenges will have both
id: 3,
name: "Run a Mile",
deadline: Thu, 26 Sep 2016,
date_started: Thu, 26 Sep 2016, # If challenge has both deadline and date_started then date_started will be the same date as the deadline
days_challenged: 30,
category: "habit",
user_id: 117,
答案 0 :(得分:2)
为模型中的这些方法创建虚拟属性。因此,该列可以在视图中访问。
attr_accessor :challenge_date
attr_accessor :next_user_challenge
attr_accessor :previous_user_challenge
您也可以使用rails active_record范围来实现相同目的。
def challenge_date
deadline || date_started
end
答案 1 :(得分:0)
希望这会有所帮助。
如果两者不相等,则表示deadline
或date_started
为nil
的情况。然后它将返回不是nil
的那个。当两者都存在时,它将返回其中一个,因为两者在用例中都是相同的。
def challenge_date
if deadline != date_started
[deadline, date_started].reject(&:blank?).join()
else
date_started
end
end