ACTIVE记录查询以从三个关联模型中获取数据

时间:2017-11-20 02:44:43

标签: mysql sql ruby-on-rails ruby rails-activerecord

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

    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

我想查询以获取具有以下详细信息的所有预订

 RESERVATIONS # | LISTING OWNER NAME  | LISTING OWNER EMAIL | LISTING OWNER PHONE | GUEST NAME | GUEST EMAIL | CLASS OF LISTING | YEAR OF LISTING | NIGHTLY RENTAL RATE OF LISTING| TOTAL RENTAL AMOUNT

模式:

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)无法提取列出的所有者名称所有者电子邮件|所有者手机,但我能够来获取访客姓名|客户电子邮件|客人手机。 如何获取LISTING OWNER详细信息?

2)如何在rails Active Record中编写上述SQL查询,以便我可以在模型或控制器中使用它来获取结果?

任何帮助都是高度赞赏的。谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

通过重新定义模型,现在您可以轻松地查询它们:

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"

答案 1 :(得分:0)

当您说“列表所有者”时,我认为您的意思是用户关系。

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