我是编程和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查询,以便我可以在模型或控制器中使用它来获取结果?
任何帮助都是高度赞赏的。谢谢!
答案 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...