Как отобразить один элемент из отношения has_many?Как мне принять изменения объекта и затем создать новый элемент в has_many? - PullRequest
0 голосов
/ 24 февраля 2012

Я пытаюсь отобразить и перехватить только самый последний элемент из отношения * has_many *. По сути, я хочу найти один объект, который существует в отношении * has_many * (на основе некоторых критериев), и отобразить его вместе с записью.

У меня есть классовые отношения, определенные так (урезано):

class Member < ActiveRecord::Base
    has_many :member_status_histories
    has_many :member_statuses, :through => :member_status_history
end

class MemberStatusHistory < ActiveRecord::Base
    belongs_to :member_status
    belongs_to :member
    has_one :timespan
end

class MemberStatus < ActiveRecord::Base
    attr_accessible :name
    has_many :memberStatusHistories
    has_many :members, :through => :memberStatusHistories
end

class Timespan < ActiveRecord::Base
    attr_accessible :startDate, :endDate
    belongs_to :timespanable, :polymorphic => true
end

В частности, используя приведенные выше классы и отношения, я хочу иметь страницу, которая отображает объект member и один объект history status object, у которого нет даты окончания. Если пользователь изменяет поля на странице для истории статуса участника , я хочу взять эту информацию и создать новый объект истории статуса участника и сохранить ее в member_status_histories в член .

Я пробовал несколько вещей, но, учитывая, что я новичок в RoR, я не уверен, какой подход использовать для этого. Кажется, есть несколько способов попытаться заставить это работать, но я не смог заставить ни один из них работать полностью.

Идея, которая показалась мне наиболее разумной, заключалась в использовании виртуального атрибута. Виртуальный атрибут предоставит объект истории статусов , который я хотел бы отобразить, а затем, когда пользователь отправит обновленные member и историю статусов , я мог запустить некоторую бизнес-логику для виртуального атрибута (используя before_save) и при необходимости обновить поле * member_status_histories *.

Опять же, мне не удалось найти какой-либо подход к работе, поэтому я открыт для предложений о том, как этого добиться. Спасибо!

1 Ответ

0 голосов
/ 24 февраля 2012

Я бы отказался от концепции нескольких MemberStatusHistories.Это быстро станет очень сложным, и, к счастью, для вас уже есть драгоценный камень, который делает все, что вы хотите, под названием paper_trail .В member_status_history.rb:

class MemberStatusHistory < ActiveRecord::Base
    has_paper_trail
    belongs_to :member_status
    belongs_to :member
    has_one :timespan
end

Затем вы можете сделать @ member.member_status_history.previous_version, чтобы увидеть версию перед текущей member_status_history, а текущая всегда является «живой» в @ member.member_status_history.Это должно позволить вам всегда видеть «самую последнюю» историю статусов участников, постоянно имея возможность произвольного числа оставшихся из таблицы версий paper_trail.

Для получения дополнительной информации о том, как все это работает, ознакомьтесь сдокументация paper_trail github .

...