通过在rails

时间:2017-01-30 08:22:59

标签: ruby-on-rails

我们中有一些人正在开发一个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), 但是我收到了验证错误,它说我需要社区。

我认为@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,等......

任何帮助都会很棒,提前谢谢。

1 个答案:

答案 0 :(得分:1)

问题是您应该设置故障单和社区之间的关系,以便通过events而不是复制外键。

class Ticket < ApplicationRecord
  belongs_to :event
  has_one :community, through: :event
end

这将导致Event作为连接表工作,这是一件好事,因为ActiveRecord只会在您从关联创建资源时跟踪一个外键关系。

has_onebelongs_to之间的区别在于belongs_to将外键列放在模型上,而has_one将其置于其他型号。这就是为什么belongs_to through:关系不可能的原因。