Определение статуса связанных моделей в классе - PullRequest
0 голосов
/ 07 июня 2011

У меня есть приложение Rails 2.3, которое отслеживает членов организации и определяет, есть ли у них платное членство.Некоторые участники могут не иметь платного членства, некоторые могут иметь платное членство на 1 год, а некоторые могут иметь пожизненное членство.Мы хотим записать историю членства участника.

В настоящее время у меня есть следующие (соответствующие) модели и схемы:

class Member < ActiveRecord::Base
   has_many :memberships
end

class Membership < ActiveRecord::Base
   belongs_to :member
end

create_table "members", :force => true do |t|
  t.string  "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "memberships", :force => true do |t|
  t.string   "name"
  t.integer  "member_id"
  t.datetime "end_date"
  t.boolean  "lifetime"
end

В настоящий момент мы определяем, является ли клиент текущим членом вПредставление, которое, конечно, не является лучшей практикой, поэтому мы хотим перенести логику в модель.Код в представлении:

<% if @memberships.count == 0 %>
  This member has never had a paid membership
<% else %>
  <% if @memberships.last.lifetime? %>
    This member is a lifetime member
  <% else %>
    <% if @memberships.last.end_date < Time.now %>
      This member's membership has expired
    <% else %>
      <% if @memberships.last.end_date > Time.now %>
        This member is a current member
      <% end %>
    <% end %>
  <% end %>
<% end %>

Мне бы хотелось (например) метод current_member и метод life_member в классе Member, который будет возвращать true или false.У меня была попытка сделать это, но я не уверен, что это лучший способ сделать это.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Вот как я могу перейти к перемещению логики в модель.

class Member < ActiveRecord::Base
   has_many :memberships

   def current_membership
     memberships.last
   end

   def has_membership?
     memberships.any?
   end

   def active?
     !expired?
   end

   def expired?
     !lifetime? && (current_membership.active? if current_membership)
   end

   def lifetime?
     current_membership.lifetime? if current_membership
   end
end


class Membership < ActiveRecord::Base
   belongs_to :member

   def active?
     !expired
   end

   def expired?
     end_date < Time.now
   end

end

Вот что вы можете написать в erb:

<% unless @member.has_membership? %>
  This member has never had a paid membership
<% end %>

<% if @member.lifetime? %>
  This member is a lifetime member
<% end %>

<% if @member.expired?%>
  This member's membership has expired
<% end %>

<% if @member.active? %>
  This member is a current member
<% end %>

И то же самое в HAML,который я рекомендую:

- unless @member.has_membership?
  This member has never had a paid membership

- if @member.lifetime?
  This member is a lifetime member

- if @member.expired?
  This member's membership has expired

- if @member.active?
  This member is a current member
1 голос
/ 07 июня 2011

Общий случай:

class Member  
  def current_member?
    if memberships.count > 0
      memberships.each{ |m| return true if m.lifetime || m.end_date > Time.now }
    end
    return false
  end

  def lifetime_member?
    if memberships.count > 0
      memberships.each{ |m| return true if m.lifetime }
    end
    return false
  end
end

Если вы уверены, что хотите проверить только последнее членство:

class Member
  def lifetime_member?
    return memberships.count > 0 && memberships.last.lifetime
  end

  def current_member?
    return memberships.count > 0 && (memberships.last.lifetime || memberships.last.end_date > Time.now }
  end  
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...