В таблице соединений, какой лучший обходной путь для Rails - отсутствие составного ключа?

Невозможно с CSS сейчас боюсь.

Лучше всего просто использовать изображение (возможно, PNG) и разместить на нем хороший текст alt / title.

В качестве альтернативы вы можете использовать SPAN или DIV и иметь изображение в качестве фона для вашего текста, который вы хотите использовать для SEO-целей внутри него, но с текстовым отступом от экрана.

30
задан pez_dispenser 19 May 2009 в 04:36
поделиться

4 ответа

Добавьте уникальный индекс, включающий оба столбца. Это помешает вам вставить запись, содержащую повторяющуюся пару category_id / post_id.

add_index :categories_posts, [ :category_id, :post_id ], :unique => true, :name => 'by_category_and_post'
37
ответ дан 27 November 2019 в 23:36
поделиться

Я думаю, вам будет проще проверить уникальность одного из полей с другим в качестве области действия:

ИЗ API:

validates_uniqueness_of(*attr_names)

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

  class Person < ActiveRecord::Base
    validates_uniqueness_of :user_name, :scope => :account_id
  end

Он также может проверить, является ли значение указанных атрибутов уникальным на основе нескольких параметров области. Например, убедиться, что учитель может быть в расписании только один раз в семестр для определенного класса.

  class TeacherSchedule < ActiveRecord::Base
    validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]
  end

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

Параметры конфигурации:

* message - Specifies a custom error message (default is: "has already been taken")
* scope - One or more columns by which to limit the scope of the uniquness constraint.
* case_sensitive - Looks for an exact match. Ignored by non-text columns (true by default).
* allow_nil - If set to true, skips this validation if the attribute is null (default is: false)
* if - Specifies a method, proc or string to call to determine if the validation should occur (e.g. :if => :allow_validation, or :if => Proc.new { |user| user.signup_step > 2 }). The method, proc or string should return or evaluate to a true or false value.
10
ответ дан 27 November 2019 в 23:36
поделиться

Я использую оба следующих варианта, когда у меня есть эта проблема в рельсах:

1) Вы должен иметь уникальный составной индекс, объявленный на уровне базы данных, чтобы гарантировать, что dbms не позволят создать дублирующую запись.

2) Чтобы предоставлять более плавные сообщения об ошибках, чем только вышеперечисленные, добавьте проверку в модель Rails:

validates_each :category_id, :on => :create do |record, attr, value|
  c = value; p = record.post_id
  if c && p && # If no values, then that problem 
               # will be caught by another validator
    CategoryPost.find_by_category_id_and_post_id(c, p)
    record.errors.add :base, 'This post already has this category'
  end
end
5
ответ дан 27 November 2019 в 23:36
поделиться

Решением может быть добавление в модель индекса и проверки.

Итак, при миграции у вас есть: add_index :categories_posts, [:category_id, :post_id], :unique => true

И в модели: validates_uniqueness_of :category_id, :scope => [:category_id, :post_id] validates_uniqueness_of :post_id, :scope => [:category_id, :post_id]

1
ответ дан 27 November 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: