2014-01-14 2 views
5

У меня есть класс City, который имеет версии, управляемые PaperTrail. Моя система имеет пользователей, которыми управляет Devise. Я хотел бы иметь отношение между пользователем, который отредактировал определенную версию класса City.Rails 3, экземпляр пользователя PaperTrail и Whodunnit

Для этого я попытался следующую конфигурацию с помощью Rails 3.2.15 и Paper Trail 3.0.0:

class City < ActiveRecord::Base 
    has_paper_trail 
end 

class User < ActiveRecord::Base 
    has_many :editions, :foreign_key => 'whodunnit', :class_name => "PaperTrail::Version" 
end 

class PaperTrail::Version < ActiveRecord::Base 
    belongs_to :user 
end 

С этим я могу иметь издания, сделанные конкретным пользователем, например:

User.last.editions, чтобы получить список выпусков (PaperTrail :: Объекты версии) от последнего пользователя.

Тогда я думал было бы просто иметь экземпляр в качестве пользователя, который редактировал конкретный город, например, чтобы получить пользовательский экземпляр пользователя, который редактировал последнюю версию первого Город:

# NoMethodError: undefined method `user' for #<PaperTrail::Version:0x000000051d0da8> 
City.first.versions.last.user 

Если это не так, как мне настроить мои модели на доступ к методу «пользователь» на PaperTrail :: Version?

Пс .: Я не уверен, что должен был создать модель PaperTrail :: Version, как и я, но я не понял другого пути в этом направлении.

ответ

11

Нашел ответ самостоятельно. Все основано на подклассе PaperTrail :: Version и использовании опции: class_name. Моя рабочая конфигурация:

class City < ActiveRecord::Base 
    has_paper_trail, :class_name => 'Version' 
end 

class User < ActiveRecord::Base 
    has_many :editions, :foreign_key => 'whodunnit', :class_name => "Version" 
end 

class Version < PaperTrail::Version 
    belongs_to :user, :foreign_key => 'whodunnit' 
end 

И теперь при вызове пользователя для конкретной версии он возвращает экземпляр whodunnit пользовательского

City.first.versions.last.user 
=> #<User id: 2, email: "[email protected]", encrypted_password: ...> 
+0

отлично! это должно работать по умолчанию в папке! – Flezcano

+1

На v4.0.0.beta2 из paper_trail, 'has_paper_trail: class_name => 'Version'' работает без запятой после' has_paper_trail'. – Nobu

Смежные вопросы