2016-11-02 1 views
1

У меня есть модели для организации и 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, я получаю сообщение об ошибке, которое говорит, что значения индекса больше не уникальны.

Я в порядке, чтобы удалить уникальное ограничение из моего индекса? Я понимаю, что 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 

Вы можете иметь бизнес-логику, которая ожидает организация, чтобы иметь ровно одну песни или точно один Logo.

Таким образом, вы можете иметь код, как:

theme = org.theme_songs.first 

или:

logo = org.logos.first 

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

Так в то время как Rails поддерживает, имеющих несколько Song с или Logo с, убедитесь, что ваш бизнес-логика не просто взять сначала в одном случае.

+0

Я не уверен, что понимаю, что вы подразумеваете под своим примером. Я хочу проверить Organisation.ips, и я хочу, чтобы это возвращало массив экземпляров ip, созданных в этой организации. – Mel

+0

Обновлено с некоторыми примерами того, что следует соблюдать. – EnabrenTane

Смежные вопросы