Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从三个关联模型获取数据的活动记录查询_Mysql_Sql_Ruby On Rails_Ruby_Rails Activerecord - Fatal编程技术网

Mysql 从三个关联模型获取数据的活动记录查询

Mysql 从三个关联模型获取数据的活动记录查询,mysql,sql,ruby-on-rails,ruby,rails-activerecord,Mysql,Sql,Ruby On Rails,Ruby,Rails Activerecord,我是编程和rails的新手。在我的rails应用程序中,我有称为“用户”、“列表”、“预订”的模型。用户有许多列表和预订。列表有许多预订,预订属于列表和用户 class User < ActiveRecord::Base has_many :listings has_many :reservations end class Listing < ActiveRecord::Base belongs_to :user has_

我是编程和rails的新手。在我的rails应用程序中,我有称为“用户”、“列表”、“预订”的模型。用户有许多列表和预订。列表有许多预订,预订属于列表和用户

    class User < ActiveRecord::Base
     has_many :listings
     has_many :reservations
    end

    class Listing < ActiveRecord::Base
    belongs_to :user
    has_many :reservations
    end


    class Reservation < ActiveRecord::Base
    belongs_to :user
    belongs_to :listing
    end
模式:

create_table "users", force: :cascade do |t|
    t.string   "email",
    t.string   "fullname",   
    t.string   "phone_number"
    end  

 create_table "listings", force: :cascade do |t|
    t.string   "vehicle_type",   
    t.string   "listing_name" ,            
    t.string   "make",                         
    t.string   "model",                        
    t.string   "year", 
    t.integer  "daily_rent",
    t.integer  "user_id"   
end

create_table "reservations", force: :cascade do |t|
    t.integer  "user_id",  
     t.integer  "total",
     t.integer  "listing_id"
 end
作为列表所有者和来宾,两者都是用户 我所能做的就是用一个简单的SQL查询,通过来宾电子邮件和电话获取所有预订详细信息,并列出相应预订的详细信息

  select r.id , u.email, u.fullname ,l.listing_name,l.year,l.daily_rent,r.total  from reservations r , users u ,listings l where u.id = r.user_id and l.id = r.listing_id;
1)无法提取房主姓名|房主电子邮件|房主电话,但我能够获取客人姓名|客人电子邮件|客人电话。 如何获取清单所有者的详细信息

2)如何在rails活动记录中编写上述SQL查询,以便在模型或控制器中使用它来获取结果

非常感谢您的帮助,谢谢

当你说“列出所有者”时,我想你指的是用户关系

reservation = Reservation.find(id) # Retrieves the reservation
reservation.user # Retrieves the associated user object
reservation.user.fullname # Listing owner name...

您可以定义自定义外键和名称,以便以更清晰的方式检索记录:

class User < ActiveRecord::Base
  has_many :listings, foreign_key: :owner_id
  has_many :reservations, foreign_key: :guest_id
end

class Listing < ActiveRecord::Base
  belongs_to :owner, class_name: 'User'
  has_many   :reservations
end

class Reservation < ActiveRecord::Base
  belongs_to :guest, class_name: 'User'
  belongs_to :listing
end
顺便说一下,要支持上述定义,您必须运行以下迁移:

class AddReferencesInListingsAndReservations < ActiveRecord::Migration
  def change
    remove_column :listings,     :user_id,    :integer
    remove_column :reservations, :user_id,    :integer
    remove_column :reservations, :listing_id, :integer

    add_reference :listings,     :owner, foreign_key: { to_table: :users }
    add_reference :reservations, :guest, foreign_key: { to_table: :users }
    add_reference :reservations, :listing
  end
end
reservation = Reservation.find_by(id: 1)
owner = reservation.listing.owner
guest = reservation.guest
total = reservation.total

# 'owner' and 'guest' are User instances. So you can invoke any fields on them that are defined in the model
owner.email
owner.fullname
owner.phone_number
class AddReferencesInListingsAndReservations < ActiveRecord::Migration
  def change
    remove_column :listings,     :user_id,    :integer
    remove_column :reservations, :user_id,    :integer
    remove_column :reservations, :listing_id, :integer

    add_reference :listings,     :owner, foreign_key: { to_table: :users }
    add_reference :reservations, :guest, foreign_key: { to_table: :users }
    add_reference :reservations, :listing
  end
end
create_table "listings", force: :cascade do |t|
  t.string   "vehicle_type",   
  t.string   "listing_name" ,            
  t.string   "make",                         
  t.string   "model",                        
  t.string   "year", 
  t.integer  "daily_rent",
  t.integer  "owner_id"
  t.index    "owner_id",   name: "index_listings_on_owner_id"
end

create_table "reservations", force: :cascade do |t|
  t.integer  "guest_id",  
  t.integer  "total",
  t.integer  "listing_id"
  t.index    "guest_id",   name: "index_listings_on_guest_id"
  t.index    "listing_id", name: "index_listings_on_listing_id"
end

add_foreign_key "listings",     "users", column: "owner_id"
add_foreign_key "reservations", "users", column: "guest_id"
add_foreign_key "reservations", "listings"