我们中有一些人正在开发一个web api,其中一位主持人希望拥有一个有很多活动的社区,而且这些活动有很多门票。
这是routes.rb文件的样子。
Rails.application.routes.draw do
resources :communities, :defaults => { :format => 'json' } do
resources :events do
resources :tickets
end
end
end
我已经获得了我的RSpec请求测试工作票,除了POST。
这是门票控制器
class TicketsController < ApplicationController
before_action :set_community, only: [:create]
before_action :set_event, only: [:index, :create]
before_action :set_ticket, only: [:show, :update, :destroy]
def index
@tickets = @event.tickets
render json: @tickets
end
def create
@ticket = @event.tickets.build(ticket_params)
if @ticket.save
render json: @ticket, status: :created, location: [@community, @event, @ticket]
else
render json: @ticket.errors, status: :unprocessable_entity
end
end
def show
render json: @ticket
end
def update
if @ticket.update(ticket_params)
render json: @ticket
else
render json: @ticket.errors, status: :unprocessable_entity
end
end
def destroy
if @ticket.destroy
render json: @ticket
else
render json: @ticket.errors, status: :unprocessable_entity
end
end
private
def ticket_params
params.require(:ticket).permit(:name, :cost, :quantity,
:sale_starts_at, :sale_ends_at)
end
def set_ticket
@ticket = Ticket.find(params[:id])
end
def set_event
@event = Event.find(params[:event_id])
end
def set_community
@community = Community.find(params[:community_id])
end
end
在创建函数中我写了@event.tickets.build(ticket_params)
,
但是我收到了验证错误,它说我需要社区。 p>
我认为@community.event.tickets.build(ticket_params)
可以正常工作,但我从@community
获得了无方法错误。
这可能不是那种深深嵌套的最佳做法,但我想知道它是如何起作用的。
以下是模型
class Community < ApplicationRecord
has_many :events
has_many :tickets, through: :event
validates :name, presence: true
validates :description, presence: true
end
class Event < ApplicationRecord
belongs_to :community
has_many :tickets
validates :name, presence: true
validates :description, presence: true
validates :event_starts_at, presence:true
validates :event_ends_at, presence:true
end
class Ticket < ApplicationRecord
belongs_to :event
belongs_to :community
validates :name, presence: true
validates :cost, presence: true,
numericality: { greater_than_or_equal_to: 0 }
validates :quantity, presence: true,
numericality: { greater_than_or_equal_to: 1 }
validates :sale_starts_at, presence: true
validates :sale_ends_at, presence: true
end
我尝试在故障单模型中编写belongs_to :community, through: :event
,但由于某种原因,我收到此错误:
ArgumentError: Unknown key: :through. Valid keys are: :class_name, :anonymous_class, :foreign_key, :validate, :autosave, :foreign_type,
等......
任何帮助都会很棒,提前谢谢。
答案 0 :(得分:1)
问题是您应该设置故障单和社区之间的关系,以便通过events
而不是复制外键。
class Ticket < ApplicationRecord
belongs_to :event
has_one :community, through: :event
end
这将导致Event作为连接表工作,这是一件好事,因为ActiveRecord只会在您从关联创建资源时跟踪一个外键关系。
has_one
和belongs_to
之间的区别在于belongs_to
将外键列放在此模型上,而has_one
将其置于其他型号。这就是为什么belongs_to through:
关系不可能的原因。