10
votes

Attributs virtuels ActiveRecord Wacked en tant qu'attributs d'enregistrement

Je rencontre un problème avec to_json ne rendant pas mes attributs virtuels xxx

event_oïde ne fait pas partie de la matrice renvoyée par: xxx < P> Ceci est particulièrement un problème pour moi lorsque vous utilisez TO_JSON qui sert automatiquement les attributs d'enregistrement à Jason. to_json omette mon attribut virtuel.

Comment créer un attribut virtuel traité comme un attribut d'instance réelle?

EDIT:

TO_JON est juste un exemple de méthode où avoir mon attribut virtuel traité comme un attribut réel serait bien.


0 commentaires

6 Réponses :


3
votes

Comment sur to_json (: méthodes => [: event_oid]) , cela fonctionne-t-il?


1 commentaires

Cela fonctionne et je pourrais avoir à utiliser cela. J'espérais juste qu'il y avait un moyen d'affronter Aciverecord dans la pensée Event_oid était l'équivalent d'une colonne dans la table des emplacements.



3
votes

implémente simplement #to_json vous-même alors: xxx


1 commentaires

Il y avait d'autres autres méthodes que je voulais que l'attribut virtuel soit considérée comme un attribut légitime autre que TO_JSON. Pour \ Json n'était qu'un exemple. J'aurais dû être plus clair.



6
votes

Vous voulez modifier les attributs hachage. Il y a un petit code supplémentaire ici pour vous assurer que les attributs que vous aimez sont prêts à être utilisés avec TO_JSON ou une autre méthode qui dépend des attributs sur la charge d'objet. XXX

TO_JON et beaucoup d'autres méthodes Générez des listes de choses basées sur des attributs d'objets. Ce qui est renseigné sur l'initialisation de l'objet avec des tables et des noms de base de données, malheureusement, les variables d'instance ne mettent pas à jour ce hachage.

P.s. Ce n'est pas très sec si vous avez un certain nombre d'attributs que vous souhaitez utiliser de cette manière. Vous pouvez utiliser un tableau de symboles, noms de méthodes déterministes et un bloc de classe_eval pour appliquer ce processus à plusieurs symboles à la fois.

Avertissement

Nous sommes Message avec des rails interne ici. Il n'y a pas de dire comment cela pourrait causer l'échec d'autres choses. Je n'ai pas testé plus que Save et To_json, qui fonctionnent tous deux lorsque l'attribut Hash contient des touches qui ne sont pas aussi des noms de colonne. Alors utilisez-le à vos risques et périls.


1 commentaires

Merci. J'ai toujours voulu savoir comment faire ça. Cela viendra utile.



0
votes

J'ai essayé Réponse de BeaSoleil François et a obtenu le fonctionnement après la modification to_json à as_json xxx


0 commentaires

0
votes
format.json { render json: @location.to_json(:methods => :event_oid) }

0 commentaires

0
votes

Une ancienne question, mais quelle optionnel demande est maintenant possible et simple une fois que vous savez comment. Ici, un exemple annulable complet mais tout ce dont vous avez besoin est dans l'emplacement de la classe. L'attribut attribut code> étend les attributs du modèle et du après_initialize code> prend en charge l'affectation de la valeur.

require 'active_record'  

ActiveRecord::Base.establish_connection(  
  :adapter=> "sqlite3",  
  :database=> ":memory:"  
)  

ActiveRecord::Schema.define do
  create_table :events do |table|
    table.column :name, :string
  end
  create_table :locations do |table|
    table.column :name, :string
    table.column :event_id, :integer
  end
end

class Event < ActiveRecord::Base
  has_one :location
end

class Location < ActiveRecord::Base
  belongs_to :event
  attribute :event_name, :string

  after_initialize do
    self.event_name = event.name
  end
end

Event.create(name: 'Event1')
Location.create(name: 'Location1', event_id: 1)
p Model.attribute_names
p Event.first
p Event.first.location

#["id", "name", "event_id", "event_name"]
#<Event id: 1, name: "Event1">
#<Location id: 1, name: "Location1", event_id: 1, event_name: "Event1">


0 commentaires