Mysql 从三个关联模型获取数据的活动记录查询
我是编程和rails的新手。在我的rails应用程序中,我有称为“用户”、“列表”、“预订”的模型。用户有许多列表和预订。列表有许多预订,预订属于列表和用户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_
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"