从其他模型访问列,其中包含rails

时间:2016-03-28 14:16:23

标签: ruby-on-rails database

我的申请中有以下关系,一个活动属于场地,一个场地属于一个区域。所以,现在在show中的events_controller.rb file行动中,我希望显示与当前事件具有相同类别和区域的相关事件。但是,事情是我的事件表中没有region_id。我尝试使用这样的地方@events = Event.check_event_validation.where(["category_id = ? and id != ? and venue.region = ?", @event.category_id, @event.id, @event.venue.region]) 它告诉我这个错误:

  

PG :: UndefinedTable:错误:缺少表格#34;场地"的FROM子句条目   第1行:...... 10.772518')AND(category_id = 5和id!= 10和   venue.regi ... ^:SELECT COUNT(*)FROM" events" WHERE(starts_at>   ' 2016-03-28 13:52:10.772518')AND(category_id = 5和id!= 10和   venue.region = 1)

如果我将上述代码更改为:@events = Event.check_event_validation.where(["category_id = ? and id != ?", @event.category_id, @event.id]) 但是,这不是我想要的,因为它会遗漏与当前事件在同一区域中的所有事件。那么,有人能给我一个正确方向的建议或指南吗?我知道我可以在我的视图中应用相同的逻辑,它可以正常工作,但我想在我的控制器中应用逻辑而不是视图。

以下是我的文件:

events_controller.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

event.rb

class Event < ActiveRecord::Base
  belongs_to :user
  belongs_to :venue
  belongs_to :category
  has_many :ticket_types
end

schema.rb

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

1 个答案:

答案 0 :(得分:3)

你想加入场地表,

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

这将返回同一类别内的所有事件,并且他们的场地与特定@event

位于同一区域