如何在模型方法中组合两个日期属性?

时间:2016-10-28 04:26:35

标签: ruby-on-rails ruby

如何在模型中创建一个方法来合并两个date,以便我可以在next_user_challengeprevious_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,

2 个答案:

答案 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)

希望这会有所帮助。

如果两者不相等,则表示deadlinedate_startednil的情况。然后它将返回不是nil的那个。当两者都存在时,它将返回其中一个,因为两者在用例中都是相同的。

def challenge_date
  if deadline != date_started
    [deadline, date_started].reject(&:blank?).join()
  else
    date_started
  end
end