2009-09-02 3 views
8

В Datamapper, как указать, что комбинация двух полей должна быть уникальной. Например, категории должны иметь уникальные имена в пределах домена:уникальный уникальный индекс datamapper

class Category 
    include DataMapper.resource 
    property :name, String, :index=>true #must be unique for a given domain 

    belongs_to :domain 
end 
+0

Где-то я заметил, что названные ключи будут группироваться так. ie: unique_index =>: имя для имени и домена. –

ответ

1

Вы пытались определить оба свойства как ключи? Не уверен, что я попробовал, но таким образом они должны стать составным ключом.

property :name, String, :key => true  
property :category, Integer, :key => true 
+0

На самом деле уже есть ключ, я просто не включил его в фрагмент кода. –

16

Вы должны создать уникальный индекс для двух свойств:

class Category 
    include DataMapper::Resource 

    property :name, String, :unique_index => :u 
    property :domain_id, Integer, :unique_index => :u 

    belongs_to :domain 
end 
+0

Это неверно, так как это требует, чтобы имя и домен были уникальными по всей таблице. Я спросил, как сделать набор (: name,: domain) уникальным. –

+0

: unique_index =>: named_u сделал именно то, что мне нужно! Благодаря! –

+0

Действительно, хотя символ ': u' мог быть более ясным - например,': index_on_name_and_domain_id' - это действительно правильно. См. Раздел Индексы на странице документации свойств DataMapper: http://rubydoc.info/github/datamapper/dm-core/master/DataMapper/Property. Операторы создают многоколоночный составной уникальный индекс. –

2

На самом деле, Джон, ответ Joschi является правильным: использование имени: unique_index значений действительно создает индекс нескольких столбцов; важно прочитать правую часть этих хэш-ракет (т. е. если бы это было только true, вы были бы правы).

+0

Я отошел от DataMapper, так что это могло измениться, но в то время, когда я написал комментарий, это было правильно. –