Как установить составной ключ в приложении Rails

Я использую «foriegner» драгоценный камень в моем приложении, чтобы установить первичный ключ, теперь я нахожусь в ситуации, чтобы установить составной первичный ключ в таблице.

Я искал в Интернете для этого, но не смог найти четкого решения для этого.

Пожалуйста, предложите мне, если это возможно, чтобы установить составные ключи в приложении рельсов, используя иностранный драгоценный камень или любым другим способом.

Note : I am using Postgres

Благодарю.

 Alexander Günther20 июн. 2012 г., 09:33
1. Вы уверены, что они вам нужны? 2. Если да, уверены ли вы, что Rails подходит для вашего приложения? AFAIK: рельсы и составные ключи совсем не дружат, это противоречит философии Rails по их использованию. Таким образом, вы будете часто сражаться с фреймворком, если собираетесь их использовать.
 balanv20 июн. 2012 г., 11:21
Хорошо ... я должен отказаться от идеи использования композитного ключа ..?
 Alexander Günther20 июн. 2012 г., 09:46
Проблема в том, что вы пропустите много «Rails Magic». и делать много дополнительной работы, например, писать sql в миграциях, которые связывают его с конкретной БД ... Другие фреймворки, которые я предлагаю, лучше поддерживают такие особые ситуации
 balanv20 июн. 2012 г., 09:40
Да, я уверен, что мне нужно использовать составной ключ. Таким образом, составные ключи не должны использоваться в рельсах ... и если мы их используем, это создаст некоторые проблемы?
 Alexander Günther20 июн. 2012 г., 11:54
То, что вы собираетесь сделать, это ваше решение. Я думаю, вы должны знать о последствиях ваших решений. Например, если вы решите использовать составные ключи на книге, которая является моделью ActiveRecord, ваши помощники * _book_path в рельсах не будут работать из коробки. Ваши миграции нуждаются в дополнительной работе ... Но если вы не собираетесь использовать составные ключи, у вас могут возникнуть более серьезные проблемы. Я не знаю вашу ситуацию, и вы сами должны решить, будет ли это разумно, что вы хотите сделать, прежде чем делать это.

Ответы на вопрос(2)

НЕ используйте композитные PK в Rails (если только вы не обязаны это делать из-за устаревшей БД).

Хотя могут быть решения с гемами, которые работают (в настоящее время), это просто не тот способ, которым работает ActiveRecord. Я также не буду использовать составные PK вне Rails, если на то нет веской причины. Они делают многое более сложным.

Но: ничто не мешает вам иметь то, что вы думаете о составном первичном ключе в качестве альтернативного ключа, и иметь PK по умолчанию в Rails (postgres: псевдотип 'serial', который извлекает свои значения из последовательности). Просто убедитесь, что вы добавили уникальный индекс для тех столбцов, которые составляют ваш ключ.

 19 июл. 2017 г., 23:22
... и есть много веских причин. то есть, работая над существующей базой данных, заполненной композитными ПК. Таким образом, просто возобновить стресс "не используй" это не так ...
 13 февр. 2017 г., 11:28
@ Oververryd спасибо за ссылку! Я все еще не согласен, хотя :-) Я думаю, что ответ действителен для Rails. Независимо от того, что вы думаете о составных ПК в SQL в целом. Поддержка является неоптимальной в Rails, поэтому лучше ее не использовать. ПО МОЕМУ МНЕНИЮ.
 12 февр. 2017 г., 21:54
Вот что я сказал: в Rails. Если нет веской причины. Пожалуйста, уточните ... в каких случаях вы бы использовали составной ключ?
 12 февр. 2017 г., 10:20
Есть много веских причин для использования составных первичных ключей. Этот ответ просто неверен и исходит из защитной ограниченной точки зрения ActiveRecord.
 13 февр. 2017 г., 10:33
Ваш вопрос, вероятно, лучше ответить здесьstackoverflow.com/questions/26078535/…
ActiveRecord

composite_primary_keys и объединяет эти функции вполне для ActiveRecord.

Поддерживаетширокий спектр версий ActiveRecord.

# Gemfile
gem 'composite_primary_keys', '=<version for your AR version>'

Используйте это как в следующем примере:

class Membership < ActiveRecord::Base
  self.primary_keys = :user_id, :group_id
end

membership = Membership.find([1,1])  # composite ids returns single instance
# => <Membership:0x39218b0 @attributes={"user_id"=>"1", "group_id"=>"1"}>

Я с радостью использую его в производстве, сохраняя свою схему в чистоте и порядке.

Better alternative: Sequel

Как всегда, если вы ищете отличное решение для Ruby + PostgreSQL, не смотрите дальшеjeremyevans/sequel.

Он поставляется с огромным количеством функций, в том числеcomposite primary keys, Из коробки.

Так что если вы начинаете новый проект (очевидно, на PostgreSQL), избавьте себя от головной боли ActiveRecord и продолжайте с Sequel.

class Post < Sequel::Model
  set_primary_key [:category, :title]
end

Ваш ответ на вопрос