Rails多态连接表空

时间:2015-04-15 09:15:13

标签: ruby-on-rails activerecord has-many-through polymorphic-associations

我正在创建一个事件系统,并且我的多态关联有困难。

事件可以是:

  • 国家:为整个群体播放(一个群体有很多商店)
  • 本地:为一家或多家商店播放

我有两种类型的jingles将在达到阈值后同时播放:

  • specific_media :在商店中播放的媒体达到了阈值
  • generic_media :在达到门槛的商店广播特定媒体时,在该群组的其他商店广播的媒体。

我的模特:

class Event < ActiveRecord::Base

  belongs_to :specific_media, polymorphic: true
  belongs_to :generic__media, polymorphic: true
  has_many :event_join
  accepts_nested_attributes_for :event_joins, allow_destroy: true


class EventJoin < ActiveRecord::Base
  belongs_to :eventable, polymorphic: true
  belongs_to :event
end

class Shop < ActiveRecord::Base
  has_many :event_joins, as: :eventable
  has_many :events,
           :through => :event_joins
end

class Group < ActiveRecord::Base
  has_many :event_joins, as: :eventable
  has_many :events, 
           :through => :event_joins
end

表:

class CreateEvents < ActiveRecord::Migration
  def up
    create_table :events do |t|
      t.string  :title
      t.references :specific_media, polymorphic: true
      t.references :generic_media, polymorphic: true
      t.string  :created_by_id
      t.string  :updated_by_id
      t.float   :threshold
      t.timestamps
    end
  end

  def down
    drop_table :events
  end
end


class CreateEventJoins < ActiveRecord::Migration
  def up
    create_table :event_joins do |t|
      t.integer :event_id
      t.references :eventable, polymorphic: true
      t.boolean :is_active, default: true
      t.string  :created_by
      t.string  :updated_by
    end
   add_index :event_joins, [:eventable_id, :eventable_type]
  end

  def down
    drop_table :event_joins
  end
end

我的控制器:

  def index
    @search   = Search.new(params[:search])
    @shop = find_user_shop(@search.shop_id)
    @events = @shop.events
  end

   def new
     @event = Event.new
   end

   def create
     @search   = Search.new(params[:search])
     @shop = find_user_shop(@search.shop_id)
     @events = @shop.events
     @event = @events.new(params[:event])
     if @event.save!
       flash.now[:notice] = "Votre événement a bien été enregistré"
       render :index
     else
       flash.now[:error] = "Erreur lors de l'enregistrement du événement"
       render :new
    end
  end

我希望eventable_type是Shop(本地)或Group(国家)。所以主要是我想要的是当我输入:

  • Shop.first.events:我收到所有本地活动(eventable_type:Shop)
  • Group.first.events:我收到所有国家赛事(eventable_type:Group)

我该怎么做?我在这种多态关联中出错了吗?

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:1)

抛弃联接表:

<强> groups.rb

# setup:
# $ gem install active_record
# $ gem install logger
# $ gem install pry
# $ gem install sqlite3
#
# run:
# $ ruby groups.rb

require 'active_record'
require 'logger'
require 'pry'

ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
ActiveRecord::Base.logger = Logger.new $stdout
ActiveSupport::LogSubscriber.colorize_logging = false

ActiveRecord::Schema.define do
  self.verbose = false

  create_table :events do |t|
    t.string  :title
    t.references :eventable, polymorphic: true, index: true
    t.string  :created_by_id
    t.string  :updated_by_id
    t.float   :threshold
  end

  create_table :shops do |t|
    t.integer :group_id
  end

  create_table :groups do |t|
  end
end

class Event < ActiveRecord::Base
  belongs_to :eventable, polymorphic: true
end

class Shop < ActiveRecord::Base
  belongs_to :group
  has_many :events, as: :eventable
end

class Group < ActiveRecord::Base
  has_many :shops
  has_many :events, as: :eventable
end

group = Group.create

shop1 = group.shops.create
shop2 = group.shops.create


group.events.create(title: "Global Event: SpaceX Rocket Launch")

shop1.events.create(title: "Local Event: Son's Birthday")
shop2.events.create(title: "Local Event: Dinner Party")

# Associations you can try to verify it works:

# shop1.events
# shop2.events
# group.events
# shop1.group.events

binding.pry