Я должен вручную создать миграцию для объединяющей таблицы HABTM?

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

=AND(ISNUMBER(MATCH("task",$A1:A1,1)),LEFT(INDEX($A1:A1,,MATCH("task",$A1:A1,1)),FIND(" ",INDEX($A1:A1,,MATCH("task",$A1:A1,1))))+MATCH("task",$A1:A1,1)-COLUMN()>=1,COLUMN()>=MATCH("task",$A1:A1,1))

Более подробно, есть external AND с 3 условиями:

  1. ISNUMBER(MATCH("task",$A1:A1,1): проверяет динамический диапазон $A1:A1 для ячейки, содержащей # / task. s> Редактировать - не требуется при условном форматировании.
  2. 1136 Легче всего понять, разбитый на куски. В качестве примера предположим, что ячейка B1 содержит 2 / task.
  • LEFT(INDEX($A1:A1,,MATCH("task",$A1:A1,1)),FIND(" ",INDEX($A1:A1,,MATCH("task",$A1:A1,1)))): находит ячейку # / task в B1 и извлекает текст слева от первого пробела, возвращая 2.
  • +MATCH("task",$A1:A1,1): добавляет номер столбца ячейки с # / task, т.е. + 2 = 4.
  • -COLUMN(): вычитает текущий столбец, о котором идет речь. Так для клетки B1, 4 - 2 = 2; C1, 4 - 3 = 1; и D1, 4 - 4 = 0 и т. д.
  • >=1: если результат предыдущего шага больше 1, ячейка должна быть выделена. Таким образом, B1 и C1 выделены, а D1 нет.
  • COLUMN()>=MATCH("task",$A1:A1,1): гарантирует, что выделение только расширяется вправо. Если бы это условие было исключено, A1 также будет выделено.
  • enter image description here

    РЕДАКТИРОВАТЬ:

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

    =AND(LEFT(INDEX($A1:A1,,AGGREGATE(14,6,COLUMN($A1:A1)/ISNUMBER(SEARCH("task",$A1:A1)),1)),FIND(" ",INDEX($A1:A1,,AGGREGATE(14,6,COLUMN($A1:A1)/ISNUMBER(SEARCH("task",$A1:A1)),1))))+AGGREGATE(14,6,COLUMN($A1:A1)/ISNUMBER(SEARCH("task",$A1:A1)),1)-COLUMN()>=1,COLUMN()>=AGGREGATE(14,6,COLUMN($A1:A1)/ISNUMBER(SEARCH("task",$A1:A1)),1))
    

    enter image description here

    Другой взгляд:

    [ 1150] enter image description here

    77
    задан Lenin Raj Rajasekaran 16 November 2013 в 14:02
    поделиться

    2 ответа

    Необходимо сделать это в миграции одной из таблиц, или в отдельной миграции, если те миграции были, работал:

    create_table :articles_tags, :id => false do |t|
      t.references :article, :tag
    end
    
    add_index :articles_tags, [:article_id, :tag_id]
    

    Это составит таблицу для Вас, и эти :id => false говорит направляющим не добавлять идентификационное поле к этой таблице. Также существует индекс, который ускорит поиски для этой объединяющей таблицы.

    Вы могли также генерировать модель (ArticlesTag) для этого и сделать:

    # article.rb
    has_many :articles_tags
    has_many :tags, :through => :articles_tags
    
    # tag.rb
    has_many :articles_tags
    has_many :articles, :through => :articles_tags
    
    # article_tag.rb
    belongs_to :tag
    belongs_to :article
    

    И затем составляют таблицу в миграции, сгенерированной от эти script/generate model articles_tag вызов.

    141
    ответ дан Ryan Bigg 24 November 2019 в 10:54
    поделиться

    Вы, вероятно, также хотите добавить индекс к миграции:

    add_index "articles_tags", "article_id"

    add_index "articles_tags", "tag_id"

    Однако, если бы Вы хотите отметить функциональность, я рекомендовал бы acts_as_taggable_on плагин направляющих:

    http://www.intridea.com/tag/acts_as_taggable_on http://github.com/mbleigh/acts-as-taggable-on/

    я использовал его на проекте, и было очень легко реализовать.

    Одна из проблем с объединяющей таблицей для меток - то, что это может легко получить ужасное создание объединяющей таблицы для каждого типа контента, который Вы хотите сделать taggable (т.е. comments_tags, posts_tags, images_tags, и т.д.). Этот плагин использует таблицу маркировок, которая включает различитель для определения типа контента без потребности определенной объединяющей таблицы для каждого типа.

    7
    ответ дан Jack Chu 24 November 2019 в 10:54
    поделиться
    Другие вопросы по тегам:

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