Вложенный ресурс Rails 3.1 с составным первичным ключом (id + parent_id) - PullRequest
1 голос
/ 11 декабря 2011

Давайте предположим, что мне нужны два ресурса, вложенных в route.rb следующим образом:

resources :post do
  resources :comment
end

По соглашению comments.id будет комментариями первичный ключ и comments.post_id будет внешним ключом .

Мне нужен первичный ключ , чтобы быть составным ключом [comments.post_id, comments.id] .

Чтобы я мог иметь каждый первый комментарий каждого отдельного поста с id == 1, каждый второй комментарий каждого отдельного поста с id == 2 и так далее ...

Конечно, мне также нужно отключить каждый маршрут, который ссылается на комментарий (дочерний ресурс), не ссылаясь также на его сообщение (родительский ресурс).

Это просто пример, мой настоящий проект не о блоге (я бы по-другому справился с этой проблемой), я хотел бы знать, есть ли способ добиться такого поведения для вложенногоресурс для обеспечения совместимости с устаревшей базой данных.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 11 декабря 2011

Один из способов сделать это - создать другой столбец (оставить posts.id как первичный ключ), добавить проверку уникальности для этого столбца с областью действия для идентификатора записи, а затем написать несколько до или после _create hood для генерации значение этого столбца.

Пример (не реальный код)

class Comment < ActiveRecord::Base
  ...
  validates_uniqueness_of :sub_id, :scope => :post_id

  before_create do
    this.sub_id = post.comments.size + 1
  end
end

Таким образом, столбец sub_id действует как первичный ключ. Когда вы запрашиваете комментарий к определенному сообщению, вы делаете это:

post.comments.where(:sub_id => val).first

или

post.comments.find_by_sub_id(val)

Пожалуйста, обратите внимание, что реальная логика здесь должна быть скорректирована, чтобы удовлетворить ваши требования. Например, если комментарии могут быть удалены, было бы неплохо сохранить счетчик для поста, который будет использоваться для определения следующего sub_id (или написать класс генератора sub id).

1 голос
/ 11 декабря 2011

На самом деле я не совсем уверен, чего вы пытаетесь достичь и почему? Может быть, вы холодно, чтобы сделать это немного яснее. В любом случае две ссылки, которые могут помочь:

Составные первичные ключи в Rails ,

Рельсовые ассоциации

Итак, если вы можете, я бы реализовал это, используя третью модель, как описано во второй ссылке выше. Если это невозможно, вы можете попробовать их, упомянутые в первой ссылке.

0 голосов
/ 15 мая 2013

Примечание: возможно, логика а-ля

before_create do this.sub_id = post.comments.size + 1 конец

должно быть подкреплено подходящей обработкой удаления комментариев. В противном случае мы скоро столкнемся с дубликатами sub_ids.

...