在多对多模型之间进行查询

时间:2015-09-08 17:25:12

标签: mysql ruby-on-rails

目前我有2个模型,通过连接表有多对多的关系。

class Deal < ActiveRecord::Base
   has_many :deal_venues, :dependent => :destroy
   has_many :venues, through: :deal_venues
end

class Venue < ActiveRecord::Base
   has_many :deal_venues, :dependent => :destroy
   has_many :deals, through:  :deal_venues
end

class DealVenue < ActiveRecord::Base
   belongs_to :deal
   belongs_to :venue
end

这是我对这些模型的架构

create_table "deals", force: true do |t|
    t.string   "name_of_deal"
    t.string   "type_of_deal"
    t.string   "description"
    t.date     "start_date"
    t.date     "expiry_date"
    t.string   "t_c"
    t.boolean  "pushed"
    t.boolean  "redeemable"
    t.boolean  "multiple_use"
    t.string   "image"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "location"
  end

create_table "venues", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "location"
end

create_table "deal_venues", force: true do |t|
    t.integer  "deal_id"
    t.integer  "venue_id"
    t.datetime "created_at"
    t.datetime "updated_at"
end

我的问题是这个。 由于我的deal_id和venue_id仅在联系表,deal_venues中,我如何在交易和场地之间查询,因为我没有每个模型的ID? 例如,如果我在查询场地内特定位置提供的交易,我该怎么做? 或许,我希望查询我的交易所在的位置。

对不起新手的问题,因为我对rails很新。谢谢!

2 个答案:

答案 0 :(得分:1)

首先,通常当人们说Rails中的多对多关系时,他们的意思是has-and-belongs-to-many。您正在使用has-many-through关系。通常情况下,这是对多对多进行建模的正确方法,只要确保你称之为现实。

Rails(特别是ActiveRecord)将在每个表上自动创建id列。所以iddeals上有venues,您可以这样做:

venue_id = <some-id>

venue = Venue.find(venue_id) 

# get all the deals for the venue
deals = venue.deals 

答案 1 :(得分:0)

您有@deal = Deal.find(2)

现在,您需要

@venues = @deal.venues

要查看SQL查询,您需要

puts @deal.venues.explain

Rails associations文档