0

我正在創建一個事件系統,並且遇到了多態聯繫問題。Rails多態聯合表空

事件可以是是:

  • 國家:廣播整個組(一組有許多商店)
  • 本地:廣播的一個或多個商店

我有兩種類型的鈴聲,在達到閾值後會同時播放:

  • specific_media:在該組的其他店鋪廣播媒體在特定媒體在達到treshold該店廣播:在達到閾值
  • 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.first.events:我得到的所有的本地事件(eventable_type:店)
  • Group.first.events:我得到的所有國家事件(eventable_type :Group)

我該怎麼做?我在這個多態關聯中出錯了嗎?

最好的問候,

回答

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