我有一个带有两个日期列的联系人模型。在这种情况下,生日和family_anniversary。当我在接下来的90天内在查询中调用.sort_by时,我会收到以下错误。
错误:
undefined method 'birthday_within_90_days' for #<Array:0x007f934fff1dd0>
故障排除: 我已经在每次通话时注释掉了.sort_by,当我这样做的时候,其他的就可以了。我能够弄清楚的最好的是它与ActiveRecord和Arrays有关。我的怀疑是我无法对从同一模型中拉出的两个阵列进行排序。但是我是新手,这是一个我完全处于黑暗中的领域。
我的模型代码,请注意我使用的是RailsLove / birthday gem,这是我获取find_#{column_name}_for
方法的地方。
def next_birthday
year = Date.today.year
mmdd = birthday.strftime('%m%d')
year += 1 if mmdd < Date.today.strftime('%m%d')
mmdd = '0301' if mmdd == '0229' && !Date.parse("#{year}0101").leap?
return Date.parse("#{year}#{mmdd}")
end
def next_anniversary
year = Date.today.year
mmdd = family_anniversary.strftime('%m%d')
year += 1 if mmdd < Date.today.strftime('%m%d')
mmdd = '0301' if mmdd == '0229' && !Date.parse("#{year}0101").leap?
return Date.parse("#{year}#{mmdd}")
end
def self.anniversary_within_90_days
find_family_anniversaries_for((Date.today), (Date.today + 90.days)).sort_by(&:next_anniversary)
end
def self.birthday_within_90_days
find_birthdays_for((Date.today), (Date.today + 90.days)).sort_by(&:next_birthday)
end
我意识到这不是干的。对于不同的日子,这将是一个不同的问题。
我的控制器代码为:
def dates
@user = current_user
contact_ids = @user.contacts.pluck(:id)
@contacts = Contact
@contacts = @contacts.where(id: contact_ids.uniq)
@contacts = @contacts.anniversary_within_90_days
@contacts = @contacts.birthday_within_90_days
@children = @user.children
@pets = @user.pets
end
我的查看代码:
<div data-equalizer class="row">
<div data-equalizer-watch class="small-12 medium-3 columns">
<%= render "layouts/sidenav" %>
</div>
<div data-equalizer-watch class="medium-9 columns contacts-list show-for-medium-up">
<ul style="list-style:none;">
<li>
<h3>Birthdays in the next 90 Days</h3>
<% @contacts.each do |contact| %>
<ul style="list-style:none;">
<% if contact.birthday.present? %>
<%= link_to "#{contact.first_name} #{contact.last_name}", contact %> <strong><%= contact.birthday.try(:strftime, "%m/%d/%Y") %></strong> (<%= contact.birthday_age %> years old)
<% end %>
</ul>
<% end %>
</li>
<li>
<h3>Children's Birthdays in the next 90 Days</h3>
<% @children.each do |child| %>
<ul style="list-style:none;">
<% if child.child_birthday.present? %>
<%= child.name %> <strong><%= child.child_birthday.try(:strftime, "%m/%d/%Y") %></strong> (<%= child.child_birthday_age %> years old)
<% end %>
</ul>
<% end %>
</li>
<li>
<h3>Anniversaries in the next 90 Days</h3>
<% @contacts.each do |contact| %>
<ul style="list-style:none;">
<% if contact.family_anniversary.present? %>
<%= link_to "#{contact.first_name} #{contact.last_name}", contact %> <strong><%= contact.family_anniversary.try(:strftime, "%m/%d/%Y") %></strong> has been married for <%= contact.family_anniversary_age %> years.
<% end %>
</ul>
<% end %>
</li>
<li>
<h3>Pets Born in the next 90 Days</h3>
<% @pets.each do |pet| %>
<ul style="list-style:none;">
<% if pet.birthday.present? %>
<%= pet.name %> <strong><%=pet.birthday.try(:strftime, "%m/%d/%Y") %></strong> (<%= pet.birthday_age %> years old)
<% end %>
</ul>
<% end %>
</li>
</ul>
</div>
</div>
有关如何解决这个问题的任何提示都很受欢迎。
答案 0 :(得分:0)
您知道何时使用Class和Instance-方法?
@contact = Contact.first # creates an instance of Contact
@contact.birthday_within_90_days
class Contact
def birthday_within_90_days
..
end
end
作品。
作为Class方法编写并使用以下代码
@contacts = Contact.birthday_within_90_days
class Contact
def self.birthday_within_90_days
...
end
end
答案 1 :(得分:0)
不要做我想做的事
这是臭代码,从长远来看表现不佳。由于应用程序中有许多日期分布在多个关系中,因此最好使用单表继承来提高运行查找和排序时的性能。