2016-11-02 13 views
1

私はOrganizationとPackage_ipのモデルを持っています。Rails - 多相関連には多くの関係インデックス値があります

団体は以下のとおりです。

組織

has_many :ips, as: :ipable, class_name: Package::Ip 
    accepts_nested_attributes_for :ips, reject_if: :all_blank, allow_destroy: true 

パッケージ:: Ipの

belongs_to :ipable, :polymorphic => true, optional: true, inverse_of: :ip 

Package_ips表はあります

create_table "package_ips", force: :cascade do |t| 
    t.string "identifier" 
    t.text  "description" 
    t.text  "conditions" 
    t.integer "ipable_id" 
    t.string "ipable_type" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    t.string "title" 
    t.string "status" 
    t.string "classification" 
    t.index ["ipable_type", "ipable_id"], name: "index_package_ips_on_ipable_type_and_ipable_id", unique: true, using: :btree 
    end 

私の目標は、CRへの組織のためでありますpackage_ipの多くのインスタンスを作成します。

ただし、インデックスの仕組みには問題があります。 package_ipの2番目のインスタンスを作成する場合、インデックス値がもはや一意ではないというエラーが表示されます。

私のインデックスからユニークな制約を削除してもよろしいですか?私はipable_ipがorganisation.idになり、ipable_typeが親クラス(組織)になることを認識しています。私はそれがなぜユニークである必要があるのか​​分かりません。しかし、多分多様な関連性とインデックスへの依存について何かを忘れているかもしれません。

答えて

0

はい、この制限はビジネスロジックからのものであり、レールに組み込まれていません。 Railsでは一意の制約を削除できるはずです。ビジネスロジックがこれを処理するのが安全であることを保証することが賢明でしょう。これは、それが名前のスコープ内うまくいけばライブ存在していたかどう

foo_ip org.ips.where(type: "foo").first

あなたはコードのように持っていることがあります。

コメント後の更新: おそらくIPを「知的財産」として使用しています。

のは、あなたはあなたが、組織が正確に一つテーマソングや正確に一つロゴを持っていることを期待するビジネス・ロジックを有することができる

class Song < Package::Ip 
end 

class ThemeSong < Song 
end 

class Logo < Package::IP 
end 

を持っているとしましょう。 Railsは複数にSong秒またはLogo sのサポートしながら、ビジネスロジックだけで取らないことを確認し、そう

logo = org.logos.first 

# Or worse yet 
logo = org.ips.where(:type = "Logo").first 

theme = org.theme_songs.first 

か:

だからあなたのようなコードを有していても良いです場合によっては最初のもの。

+0

あなたの例が何を意味するのか分かりません。私はOrganisation.ipsをテストしたいので、その組織で作成されたIPインスタンスの配列を返すようにします。 – Mel

+0

注意すべき事項のいくつかの例を更新しました。 – EnabrenTane