How to migrate paper_trail's whodunnit column from string to integer?
In a legacy Rails app using paper_trail, the whodunnit column is set to string and instead of the default current_user.id, this column holds the user's email. This is achieved by overriding user_for_paper_trail in ApplicationController:
def user_for_paper_trail
current_user.email
end
Now I want to migrate to the default behavior of storing the id of the current user instead of the email.
So the approach I was thinking to take was something like this:
- add a new integer column to the
versionstable, maybe namedwhodunnit_new; - remove
user_for_paper_trailmethod in application controller and tell the models to write whodunnit info inwhodunnit_newinstead ofwhodunnit. This means, that for new versions, paper_trail is savingidinwhodunnit_newand is not savingemailinwhodunnit; - backfill
whodunnit_newfor old records by finding the user by email and saving thier id in the new column; - drop the
whodunnitcolumn; - rename
whodunnit_newtowhodunnitand remove the setting in the models for usingwhodunnit_new.
The problem is - I couldn't find a setting, which can set the name of the whodunnit column, it seems to me, that it is hard-coded. I saw that there is an alias for the whodunnit method (called version_author).
I'm using Papertrail 10 and Rails 5.2.
So my question - what should be the proper way of doing the described migration.
ruby-on-rails paper-trail-gem
add a comment |
In a legacy Rails app using paper_trail, the whodunnit column is set to string and instead of the default current_user.id, this column holds the user's email. This is achieved by overriding user_for_paper_trail in ApplicationController:
def user_for_paper_trail
current_user.email
end
Now I want to migrate to the default behavior of storing the id of the current user instead of the email.
So the approach I was thinking to take was something like this:
- add a new integer column to the
versionstable, maybe namedwhodunnit_new; - remove
user_for_paper_trailmethod in application controller and tell the models to write whodunnit info inwhodunnit_newinstead ofwhodunnit. This means, that for new versions, paper_trail is savingidinwhodunnit_newand is not savingemailinwhodunnit; - backfill
whodunnit_newfor old records by finding the user by email and saving thier id in the new column; - drop the
whodunnitcolumn; - rename
whodunnit_newtowhodunnitand remove the setting in the models for usingwhodunnit_new.
The problem is - I couldn't find a setting, which can set the name of the whodunnit column, it seems to me, that it is hard-coded. I saw that there is an alias for the whodunnit method (called version_author).
I'm using Papertrail 10 and Rails 5.2.
So my question - what should be the proper way of doing the described migration.
ruby-on-rails paper-trail-gem
add a comment |
In a legacy Rails app using paper_trail, the whodunnit column is set to string and instead of the default current_user.id, this column holds the user's email. This is achieved by overriding user_for_paper_trail in ApplicationController:
def user_for_paper_trail
current_user.email
end
Now I want to migrate to the default behavior of storing the id of the current user instead of the email.
So the approach I was thinking to take was something like this:
- add a new integer column to the
versionstable, maybe namedwhodunnit_new; - remove
user_for_paper_trailmethod in application controller and tell the models to write whodunnit info inwhodunnit_newinstead ofwhodunnit. This means, that for new versions, paper_trail is savingidinwhodunnit_newand is not savingemailinwhodunnit; - backfill
whodunnit_newfor old records by finding the user by email and saving thier id in the new column; - drop the
whodunnitcolumn; - rename
whodunnit_newtowhodunnitand remove the setting in the models for usingwhodunnit_new.
The problem is - I couldn't find a setting, which can set the name of the whodunnit column, it seems to me, that it is hard-coded. I saw that there is an alias for the whodunnit method (called version_author).
I'm using Papertrail 10 and Rails 5.2.
So my question - what should be the proper way of doing the described migration.
ruby-on-rails paper-trail-gem
In a legacy Rails app using paper_trail, the whodunnit column is set to string and instead of the default current_user.id, this column holds the user's email. This is achieved by overriding user_for_paper_trail in ApplicationController:
def user_for_paper_trail
current_user.email
end
Now I want to migrate to the default behavior of storing the id of the current user instead of the email.
So the approach I was thinking to take was something like this:
- add a new integer column to the
versionstable, maybe namedwhodunnit_new; - remove
user_for_paper_trailmethod in application controller and tell the models to write whodunnit info inwhodunnit_newinstead ofwhodunnit. This means, that for new versions, paper_trail is savingidinwhodunnit_newand is not savingemailinwhodunnit; - backfill
whodunnit_newfor old records by finding the user by email and saving thier id in the new column; - drop the
whodunnitcolumn; - rename
whodunnit_newtowhodunnitand remove the setting in the models for usingwhodunnit_new.
The problem is - I couldn't find a setting, which can set the name of the whodunnit column, it seems to me, that it is hard-coded. I saw that there is an alias for the whodunnit method (called version_author).
I'm using Papertrail 10 and Rails 5.2.
So my question - what should be the proper way of doing the described migration.
ruby-on-rails paper-trail-gem
ruby-on-rails paper-trail-gem
edited Nov 26 '18 at 13:44
Alex Popov
asked Nov 26 '18 at 12:54
Alex PopovAlex Popov
7,646145285
7,646145285
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
.. I couldn't find a setting, which can set the name of the whodunnit column, it seems to me, that it is hard-coded.
Correct, the column must be named whodunnit. It is not configurable.
Otherwise your migration sounds good. Use a transaction and you won't need to temporarily rename the column. (Unless you're using MySQL, which has "weak" transactions, ie. not protected against DDL)
add a comment |
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481579%2fhow-to-migrate-paper-trails-whodunnit-column-from-string-to-integer%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
.. I couldn't find a setting, which can set the name of the whodunnit column, it seems to me, that it is hard-coded.
Correct, the column must be named whodunnit. It is not configurable.
Otherwise your migration sounds good. Use a transaction and you won't need to temporarily rename the column. (Unless you're using MySQL, which has "weak" transactions, ie. not protected against DDL)
add a comment |
.. I couldn't find a setting, which can set the name of the whodunnit column, it seems to me, that it is hard-coded.
Correct, the column must be named whodunnit. It is not configurable.
Otherwise your migration sounds good. Use a transaction and you won't need to temporarily rename the column. (Unless you're using MySQL, which has "weak" transactions, ie. not protected against DDL)
add a comment |
.. I couldn't find a setting, which can set the name of the whodunnit column, it seems to me, that it is hard-coded.
Correct, the column must be named whodunnit. It is not configurable.
Otherwise your migration sounds good. Use a transaction and you won't need to temporarily rename the column. (Unless you're using MySQL, which has "weak" transactions, ie. not protected against DDL)
.. I couldn't find a setting, which can set the name of the whodunnit column, it seems to me, that it is hard-coded.
Correct, the column must be named whodunnit. It is not configurable.
Otherwise your migration sounds good. Use a transaction and you won't need to temporarily rename the column. (Unless you're using MySQL, which has "weak" transactions, ie. not protected against DDL)
answered Dec 12 '18 at 18:25
Jared BeckJared Beck
10.4k35078
10.4k35078
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481579%2fhow-to-migrate-paper-trails-whodunnit-column-from-string-to-integer%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
