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)
。