1
votes

Rails: mettre à jour un attribut à nil

J'ai une colonne entière post_id qui a une valeur dans la base de données et je voudrais la mettre à jour à nil à partir du contrôleur.

J'ai essayé ce qui suit mais malheureusement la valeur reste la idem et ne change pas en nil:

Account Update (0.6ms)  UPDATE "accounts" SET "post_id" = $1, "updated_at" = $2 WHERE "accounts"."id" = $3  [["post_id", 96], ["updated_at", "2019-02-27 10:43:53.432402"], ["id", 49]]

Des idées sur la façon dont je peux mettre à jour l'identifiant du message à zéro?

Mise à jour 1 strong>

Tableau de compte

def remove_post
  current_user.account.update_attributes(post_id: nil)
end

le lien vers:

get "user/remove_post", to: "accounts#remove_post", :as => : remove_post

l'itinéraire: p>

<%= link_to "Remove post from user", remove_post_path, data: { confirm: "Are you sure?" } %>

la méthode du contrôleur:

create_table "accounts", force: :cascade do |t|
  t.string "name"
  t.string "street"
  t.string "city"
  t.string "state"
  t.string "postal_code"
  t.string "country"
  t.integer "post_id", default: 0
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

Ce que j'obtiens dans la console:

current_user.account.update(post_id: nil)
current_user.account.update(post_id: 0)


12 commentaires

Pourriez-vous fournir vos définitions de modèle?


@mbuechmann ... Si vous parlez du schéma de table, j'ai mis à jour ma question avec cette info. Si vous parlez d'autre chose, faites-moi savoir quoi. N'oubliez pas que la colonne contient déjà une valeur entière.


Vérifiez également ce api.rubyonrails.org/classes/ActiveRecord/…


@Theopap non, je veux dire la définition du modèle;)


désolé @mbuechmann je n'ai aucune idée de ce que vous demandez. Les associations?


Oui. Mais je vois, vous l'avez déjà posté ailleurs.


Ce serait bien mieux si vous ajoutiez toutes les informations demandées à votre question. Pour le moment, ces informations sont toutes dispersées dans de nombreux commentaires. Cela rend la réponse à votre question un travail très difficile.


Pourriez-vous s'il vous plaît ajouter le code d'action complet du contrôleur?


@ mbuechmann je viens de mettre à jour ma question avec toutes les informations.


@Vasilisa je viens de mettre à jour ma question avec toutes les informations.


@Theopap est-ce la seule ligne Account Update dans le journal? Il est préférable de publier l'intégralité du journal. Peut-être avez-vous des rappels dans le modèle de compte?


C'est le seul que je mets à jour et dans la console ne renvoie aucun rappel. Je sais que c'est bizarre. La question est la suivante: puis-je mettre à jour une colonne entière dont la valeur est déjà nulle?


3 Réponses :


0
votes

Il semble que vous ayez la relation entre le compte et la publication. Par défaut, Rails valide le temps que la relation existe. Vous pouvez changer cela en ajoutant facultatif: true à votre modèle:

class Account < ApplicationRecord
  belongs_to :post, optional: true
end

Après cela, vous pouvez changer avec succès la valeur de cette colonne en nil.


12 commentaires

Merci pour la réponse @barmic, j'ai déjà cette configuration dans mon modèle de compte appartient_to: post, facultatif: vrai .


Recevez-vous une restauration après avoir essayé de changer?


Mise à jour du compte (0,5 ms) UPDATE "accounts" SET "post_id" = $ 1, "updated_at" = $ 2 WHERE "accounts". "id" = $ 3 [["post_id", 94], ["updated_at", " 2019-02-27 09: 58: 10.479125 "], [" id ", 47]]


C'est ce que j'obtiens ... il semble que cela conserve la valeur existante pour une raison étrange.


Quelque chose ne va pas avec votre manette? Essayez de mettre à jour l'enregistrement à l'aide de la console.


La sortie indique que vous définissez le post_id sur 94 et non sur nil.


Cela fonctionne bien quand je fais cela depuis la console: Account.find (47) .update (post_id: nil)


Le problème vient donc probablement du contrôleur. Pourriez-vous publier l'action du contrôleur responsable de la mise à jour?


@mbuechmann oui je sais ... mais je fais ceci: current_user.account.update_attributes (post_id: nil) qui devrait être correct.


Alors vous devez faire autre chose aussi. Pourriez-vous vérifier cela? Êtes-vous sûr d'appeler cette action de contrôleur?


@barmic c'est tout ce que j'ai dans l'action du contrôleur: current_user.account.update_attributes (post_id: nil)


Je suis sûr que cette ligne n'est pas appelée. Ensuite, vous devez être dans un contrôleur ou une action différent.



1
votes

Essayez peut-être

ac = Account.first
ac.post_id = nil
ac.save(validate: false)


0 commentaires

1
votes

J'ai choisi ceci:

Account.update(current_user.account.id, post_id: nil)

Faites-moi savoir si une autre solution pourrait être meilleure.


0 commentaires