Ruby-on-rails 连接两个表以获取数据轨道 4

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19699911/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 22:58:48  来源:igfitidea点击:

join two tables to get data rails 4

ruby-on-railsactiverecorddeviseruby-on-rails-4

提问by G.B

class Guardian < ActiveRecord::Base
  has_many :patients
  has_one :user, as: :profile
  accepts_nested_attributes_for :user
end


class User < ActiveRecord::Base
  belongs_to :profile, :polymorphic => true

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

User migration

用户迁移

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              :null => false, :default => ""
      t.string :encrypted_password, :null => false, :default => ""
      t.string :username, :null => false
      t.string :address
      t.integer :age
      t.string :gender
      t.string :name
      t.integer :profile_id
      t.string :profile_type

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, :default => 0, :null => false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
  end
end

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              :null => false, :default => ""
      t.string :encrypted_password, :null => false, :default => ""
      t.string :username, :null => false
      t.string :address
      t.integer :age
      t.string :gender
      t.string :name
      t.integer :profile_id
      t.string :profile_type

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, :default => 0, :null => false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip
      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    end
end

Guardian migration

监护人迁移

class CreateGuardians < ActiveRecord::Migration
  def change
    create_table :guardians do |t|
      t.string :family_name

      t.timestamps
    end
  end
end

I want to get data from user table and guardian table in a single variableguardian has one user and user belongs_to guardian as profile(polymorphic). i want to get data from user table and from guardian table where guardian_id=users.profile_id

我想从单个变量中的用户表和监护人表中获取数据监护人有一个用户,用户属于监护人作为配置文件(多态)。我想从用户表和监护人表中获取数据,其中 Guardian_id=users.profile_id

回答by Hitham S. AlQadheeb

Try

尝试

Guardian.select("*").joins(:user)

Edit:

编辑:

if you have columns with the same name from the join you can do

如果您有来自连接的同名列,您可以这样做

Guardian.select("guardians.family_name, guardians.id as g_id, users.id as u_id,
    users.name, users.email, users.username, users.address, users.age,
    users.gender").joins(:user).where(:users => {:u_id => @user_session.id}) 

回答by Sanjeev

For some reason above answer didn't work for me, so I tried direct sql query

由于某种原因,上面的答案对我不起作用,所以我尝试了直接 sql 查询

sqlQuery = "select tableA.column1, tableB.column2 from tableA inner join tableB on tableA.some_id = tableB.id"
ActiveRecord::Base.connection.execute(sqlQuery)