Ruby on Rails - первичный и внешний ключ - PullRequest
2 голосов
/ 10 мая 2010

Я создаю сайт в Ruby on Rails, у меня есть две модели: модель User и модель Transaction.

Обе эти модели принадлежат учетной записи, поэтому у них есть поле с именем account_id

Я пытаюсь установить связь между ними следующим образом:

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

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

Я использую эти ассоциации вот так:

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

В данный момент приложение пытается найти транзакции с user_id, вот SQL, который оно генерирует:

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

Это неверно, так как я хотел бы найти транзакции через account_id, я попытался установить ассоциации следующим образом:

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

Это почти достигает того, что я ищу, и генерирует следующий SQL:

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

Номер 104 является правильным account_id, но он все еще пытается запросить таблицу транзакций для поля user_id. Может кто-нибудь дать мне несколько советов о том, как настроить ассоциации для запроса таблицы транзакций для account_id вместо user_id, что приводит к SQL-запросу, например так:

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

Приветствия

Eef

Ответы [ 3 ]

3 голосов
/ 10 мая 2010
class Account < ActiveRecord::Base
  has_many :users
  has_many :transactions
end

class User < ActiveRecord::Base
  has_many :transactions, :through => :account
end

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001833

0 голосов
/ 20 марта 2015

Я хочу сохранить данные в адресной модели, связанной с моделью студента

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 голосов
/ 10 мая 2010

Если в таблице transactions нет значения user_id, то для выбора всех транзакций следует использовать модель Account:

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

Обратите внимание, что вы должны удалить has_many :transactions из User и belongs_to :user из Transaction, так как они предполагают, что у вас есть столбец user_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...