我的申请中有以下关系,一个活动属于场地,一个场地属于一个区域。所以,现在在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
答案 0 :(得分:3)
你想加入场地表,
@events_in_the_same_region = Event.joins(:venue).where(
events: { category: @event.category },
venues: { region_id: @event.venue.region.id }
)
这将返回同一类别内的所有事件,并且他们的场地与特定@event