2010-05-10 6 views
2

Je crée un site en Ruby on Rails, j'ai deux modèles un modèle User et un modèle Transaction.Ruby on Rails - Clé primaire et étrangère

Ces modèles appartiennent tous deux à un compte afin qu'ils ont tous deux un champ appelé account_id

Je suis en train d'installer une association entre eux comme ceci:

class User < ActiveRecord::Base 
    belongs_to :account 
    has_many :transactions 
end 

class Transaction < ActiveRecord::Base 
    belongs_to :account 
    belongs_to :user 
end 

J'utilise ces associations comme ceci:

user = User.find(1) 
transactions = user.transactions 

au moment de l'application tente de trouver les transactions avec le user_id, voici le SQL qu'il génère:

Mysql::Error: Unknown column 'transactions.user_id' in 'where clause': SELECT * FROM `transactions` WHERE (`transactions`.user_id = 1) 

Ceci est incorrect que je voudrais la trouver les transactions via le account_id, j'ai essayé de placer les associations comme ceci:

class User < ActiveRecord::Base 
    belongs_to :account 
    has_many :transactions, :primary_key => :account_id, :class_name => "Transaction" 
end 

class Transaction < ActiveRecord::Base 
    belongs_to :account 
    belongs_to :user, :foreign_key => :account_id, :class_name => "User" 
end 

Ce permet généralement d'atteindre ce que je cherche à faire et génère les SQL suivante:

Mysql::Error: Unknown column 'transactions.user_id' in 'where clause': SELECT * FROM `transactions` WHERE (`transactions`.user_id = 104) 

le numéro 104 est le account_id correct, mais il essaye toujours d'interroger la table de transaction pour user_id champ. Quelqu'un pourrait-il me donner quelques conseils sur la façon dont je configurer les associations pour interroger la table de transaction pour le account_id au lieu du user_id résultant dans une requête SQL comme ceci:

SELECT * FROM `transactions` WHERE (`transactions`.account_id = 104) 

Vive

Eef

Répondre

0

Si vous ne disposez pas du columnt user_id dans le transactions ta ble alors vous devriez utiliser le modèle Account pour sélectionner toutes les transactions:

class User < ActiveRecord::Base 
    belongs_to :account 
end 

class Account < ActiveRecord::Base 
    has_many :transactions 
    has_one :user # or has_many :users 
end 

class Transaction < ActiveRecord::Base 
    belongs_to :account 
end 

User.find(1).account.transactions 

Notez que vous devez supprimer has_many :transactions de User et belongs_to :user de Transaction comme ils supposent que vous avez la colonne user_id.

-1

Je veux stocker des données dans le modèle d'adresse que l'association avec le modèle étudiant

class AddressesController < ApplicationController 

    def new 
     @address = Address.new  
    end 

    def create 
     @address = Address.create(:address_date => Time.now, 
      :student_id => @student.id) 
    end 

    private 

    def address_params 
     params.require(:address).permit(:gali_no, :house_no_flate_no, :vill_town_city, :district, :state, :post_code, :country) 
    end 
end 






class StudentsController < ApplicationController 

    def show 

    end 

    def new 
     @student = Student.new 
    end 

    def create 
     @student = Student.new(student_params) 

     if @student.save 
      redirect_to root_url, :notice => "You have been registered" 
     else 
      render "new" 
     end 
    end 

    private 
    def student_params 
     params.require(:student).permit(:f_name, :l_name, :email, :password, :password_confirmation, :mobile_no) 
    end 
end 


class Student < ActiveRecord::Base 

    has_many :addressess, :dependent => :destroy 

    attr_accessor :password 

    before_save :encrypt_password 

    validates_confirmation_of :password 
    validates_presence_of :f_name 
    validates_presence_of :l_name 
    validates_presence_of :password, :on => :create 
    validates_presence_of :email 
    validates_uniqueness_of :email 

    def encrypt_password 
     if password.present? 
      self.password_salt = BCrypt::Engine.generate_salt 
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt) 
     end 
    end 
end 




class Address < ActiveRecord::Base 

    belongs_to :student 

end 
+0

Vous devriez construire la réponse correctement avec la mise en évidence de la syntaxe correcte et indentation. – RatDon