Ruby on rails 使用where rails从另一个模型访问列

Ruby on rails 使用where rails从另一个模型访问列,ruby-on-rails,database,Ruby On Rails,Database,在我的申请中,我有以下关系:一个活动属于场馆,一个场馆属于一个地区。因此,现在在我的events\u controller.rb文件中的show操作中,我想显示与当前事件具有相同类别和区域的相关事件。但是,问题是我的事件表中没有区域id。我尝试使用where,比如@events=Event。检查事件验证。where([“category\u id=?and id!=?and venture.region=?”,@Event.category\u id,@Event.id,@Event.venue

在我的申请中,我有以下关系:一个活动属于场馆,一个场馆属于一个地区。因此,现在在我的
events\u controller.rb文件中的
show
操作中,我想显示与当前事件具有相同类别和区域的相关事件。但是,问题是我的事件表中没有区域id。我尝试使用where,比如
@events=Event。检查事件验证。where([“category\u id=?and id!=?and venture.region=?”,@Event.category\u id,@Event.id,@Event.venue.region])
它向我显示了这个错误:

PG::UnfinedTable:错误:表“场所”的子句条目中缺少 第1行:…10.772518')和(类别id=5和id!=10和 地点区域…^:从“事件”中选择计数(*),其中(开始时间> “2016-03-28 13:52:10.772518”)和(类别id=5和id!=10和 地点(地区=1)

如果我将上述代码更改为:
@events=Event.check\u Event\u validation.where([“category\u id=?and id!=?”,@Event.category\u id,@Event.id])
然而,这不是我想要的,因为它将忽略与当前事件在同一区域内的所有事件。因此,有人能给我一个建议或指导,引导我正确的方向吗?我知道我可以在我的视图中应用相同的逻辑,它会很好地工作,但我想在控制器中应用逻辑,而不是视图

这是我的档案:

事件\u控制器.rb

 def show
    @event = Event.find(params[:id])
    @events = Event.check_event_validation.where(["category_id = ? and id != ? and venue.region = ?", @event.category_id, @event.id, @event.venue.region])
end
class Event < ActiveRecord::Base
  belongs_to :user
  belongs_to :venue
  belongs_to :category
  has_many :ticket_types
end
ActiveRecord::Schema.define(version: 20160327074316) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "categories", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "events", force: :cascade do |t|
    t.datetime "starts_at"
    t.datetime "ends_at"
    t.integer  "venue_id"
    t.string   "hero_image_url"
    t.text     "extended_html_description"
    t.integer  "category_id"
    t.string   "name"
    t.datetime "created_at",                null: false
    t.datetime "updated_at",                null: false
    t.integer  "user_id"
  end

  add_index "events", ["category_id"], name: "index_events_on_category_id", using: :btree
  add_index "events", ["venue_id"], name: "index_events_on_venue_id", using: :btree

  create_table "regions", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "ticket_types", force: :cascade do |t|
    t.integer  "event_id"
    t.integer  "price"
    t.string   "name"
    t.integer  "max_quantity"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
    t.integer  "ticket_id"
  end

  add_index "ticket_types", ["event_id"], name: "index_ticket_types_on_event_id", using: :btree

  create_table "tickets", force: :cascade do |t|
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "ticket_type"
  end

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet     "current_sign_in_ip"
    t.inet     "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.string   "username"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
  add_index "users", ["username"], name: "index_users_on_username", unique: true, using: :btree

  create_table "venues", force: :cascade do |t|
    t.string   "name"
    t.string   "full_address"
    t.integer  "region_id"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
  end

  add_index "venues", ["region_id"], name: "index_venues_on_region_id", using: :btree

  add_foreign_key "events", "categories"
  add_foreign_key "events", "venues"
  add_foreign_key "ticket_types", "events"
  add_foreign_key "venues", "regions"
end
事件.rb

 def show
    @event = Event.find(params[:id])
    @events = Event.check_event_validation.where(["category_id = ? and id != ? and venue.region = ?", @event.category_id, @event.id, @event.venue.region])
end
class Event < ActiveRecord::Base
  belongs_to :user
  belongs_to :venue
  belongs_to :category
  has_many :ticket_types
end
ActiveRecord::Schema.define(version: 20160327074316) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "categories", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "events", force: :cascade do |t|
    t.datetime "starts_at"
    t.datetime "ends_at"
    t.integer  "venue_id"
    t.string   "hero_image_url"
    t.text     "extended_html_description"
    t.integer  "category_id"
    t.string   "name"
    t.datetime "created_at",                null: false
    t.datetime "updated_at",                null: false
    t.integer  "user_id"
  end

  add_index "events", ["category_id"], name: "index_events_on_category_id", using: :btree
  add_index "events", ["venue_id"], name: "index_events_on_venue_id", using: :btree

  create_table "regions", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "ticket_types", force: :cascade do |t|
    t.integer  "event_id"
    t.integer  "price"
    t.string   "name"
    t.integer  "max_quantity"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
    t.integer  "ticket_id"
  end

  add_index "ticket_types", ["event_id"], name: "index_ticket_types_on_event_id", using: :btree

  create_table "tickets", force: :cascade do |t|
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "ticket_type"
  end

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet     "current_sign_in_ip"
    t.inet     "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.string   "username"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
  add_index "users", ["username"], name: "index_users_on_username", unique: true, using: :btree

  create_table "venues", force: :cascade do |t|
    t.string   "name"
    t.string   "full_address"
    t.integer  "region_id"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
  end

  add_index "venues", ["region_id"], name: "index_venues_on_region_id", using: :btree

  add_foreign_key "events", "categories"
  add_foreign_key "events", "venues"
  add_foreign_key "ticket_types", "events"
  add_foreign_key "venues", "regions"
end

你想加入场馆表

@events_in_the_same_region = Event.joins(:venue).where(
  events: { category: @event.category },
  venues: { region_id: @event.venue.region.id }
)

这将返回所有属于同一类别且其场馆与您要加入场馆表的特定
@event
位于同一地区的赛事

@events_in_the_same_region = Event.joins(:venue).where(
  events: { category: @event.category },
  venues: { region_id: @event.venue.region.id }
)

这将返回与特定
@event

相同类别的所有活动,它们的场地与特定
@event

非常感谢。尽管我必须编辑您的代码:
@events\u in\u the\u same\u region=event.joins(:场地)。其中(活动:{category\u id:@event.category\u id},场地:{region\u id:@event.venture.region})
否则,它将抛出错误:
PG::UnfinedColumn:error:column vironments.region不存在第1行:…在“场馆”上使用“ues”。“id”=“events”。“vention\u id”在“场馆”中使用“…^:选择“events”。*从“events”在“场馆”中使用“events”。“id”;“vention\u id”在“场馆”中使用“region”=2和“events”。“category”=6
再问一个问题,现在一切正常。但是,我不想在相关事件组中再次向用户显示当前事件。因此,如何在联接表中添加该条件,例如
where(id!=@event.id)
。非常感谢。尽管我必须将您的代码编辑为:
@events\u in\u the\u same\u region=Event.joins(:venture)。其中(events:{category\u id:@Event.category\u id},viouses:{region\u id:@Event.venture.region})
否则,它将向我抛出错误:
PG::UnfinedColumn:错误:column Vinces.region不存在第1行:…在“Vinces”上使用“ues”。“id”=“events”。“Vincement”;“Vinces”;“Vinces”;“Vinces”;“region”;“events”;“events”;“region”;“events”;“region”;“events”;“category”中选择“events”。*从“events”内部连接“Vinces”。“Vinces”。“Vinces”。”=6
再问一个问题,现在一切正常。但是,我不想在相关事件组中再次向用户显示当前事件。因此,如何在联接表中添加该条件,例如
where(id!=@event.id)