2014-05-01 2 views
0

Dans la console

a = Reported.new 

Cela fonctionne. Après avoir bricolé.Rails base de données relationnelle ne fonctionne pas comme je veux

a.profile = Profile.first 

Mais ce n'est pas ce que je veux! Je veux qu'un profil existe même. Je veux que a.reported_by soit un profil! Et je veux a.reported être un profil!

Encore une fois ce que je veux est

a.reported_by = Profile.last #or any such profile 
a.reported = Profile.first #or any such profile 

Modèle

class Profile < ActiveRecord::Base 
    has_many :reported, dependent: :destroy 

Migration

Il n'a pas une colonne signalé, je ne suis pas sûr de la bonne façon de mettre en œuvre que soit .

class CreateReporteds < ActiveRecord::Migration 
    def change 
    create_table :reporteds do |t| 
     t.belongs_to :profile 
     t.integer :reported_by 
     t.string :reason 
     t.timestamps 
    end 
    end 
end 
+0

Êtes-vous sûr de vouloir 'a.blocked_by' ou est-ce' a.reported_by'? Est-ce une faute de frappe. –

+0

Ahh remercie Kirti! C'était une faute de frappe! @KirtiThorat mais j'ai toujours mon problème! – bezzoon

Répondre

1

Votre migration semble ... éteinte. Je n'ai jamais vu t.belongs_to :something dans une migration - ne devrait-il pas être t.integer :profile_id? (Je n'ai pas trouvé de documentation supportant la syntaxe belongs_to là).

Si vous voulez Reported#reported_by pour retourner un Profile, alors vous avez besoin d'un nombre entier reported_by_id sur elle, pas un entier reported_by. Rails a une convention où vous devriez faire vos objets référencés (dans ce cas, une relation) utilisez le format relationship_id pour sa clé étrangère.

Ensuite, vous devriez avoir dans votre classe:

class Reported < ActiveRecord::Base 
    belongs_to :reported_by, class_name: "Profile" 
end 

Ce si elle utilise fera reported_by_id comme la clé étrangère pour un objet Profile, mais revenir comme Reported#reported_by.

Puis:

class Profile < ActiveRecord::Base 
    has_many :reporteds, foreign_key: 'reported_by_id' 
end 

Si vous laisser faire Profile#reporteds

Et votre migration ressemblerait à ceci:

class CreateReporteds < ActiveRecord::Migration 
    def change 
    create_table :reporteds do |t| 
     t.integer :reported_by_id 
     t.string :reason 
     t.timestamps 
    end 
    end 
end 
+0

Okay! Alors maintenant a.reported_by = Profile.last fonctionne. Mais je veux a.reported d'apporter le profil qui a été signalé! Ça ne marche toujours pas! – bezzoon

+0

NVM Je l'ai eu pour fonctionner avec belongs_to: signalé, class_name: "Profile" – bezzoon

+1

Ok, assurez-vous que vous avez aussi un 'report_id' sur la table;) – nzifnab

Questions connexes