<commit_before>= bitrix_on_rails

Приблуды для использования под рельсами базы 1С:Битрикс.

Для каждого инфоблока что лежит в b_iblock есть своя таблица название которой с номером инфоблока, например b_iblock_element_prop_s7
prop_s - для одиночных свойтсв, prop_m - для множестенный.
У каждого инфоблока нескоолько секций (iblock_section), в каждой секции несколько элементов (iblock_element) у каждого элемента разные свойства которые лежат в prop_s/_m.
Соответсвенно я эти свойства вытащил в одно место - они все доступны из модели IblockElement. Или напрямую; IblockElement.find(123).НАЗВАНИЕ_СВОЙСТВА или через метод properties

== Установка

   gem 'bitrix_on_rails'


В файл `config/initialize/bitrix_on_rails.rb` впишите:

   BitrixOnRails.init

== Что есть:

=== mysql2_downcase адаптер
1. Адаптер mysql2_downcase для автоматической конвертации заглавных наименований полей в прописные.

=== Инфоблоки

1. Все модели для таблиц b_iblock_*
2. Автоматическая установка свойств из таблиц prop_s*/prop_m* в методы объекта IblockElement.
   Например IblockElement.find(1).name_emittents, где name_emittent - свойство из prop_s.
   Все подобные свойства также доступны через метод IblockElement#properties.

3. IblockElementS*
 1. Тоже самое и для моделей IblockElementPropertyS*, плюс в них значения полей можно еще и устанавливать:

   p = IblockElementPropertyS3.find(1)
   p.name_emittents='новое имя'
   p.save

 2. Поиск по кодовым названиям полей таблицы

   IblockElementPropertyS3.find_by_post_id(123)

   вместо

   .find_by_property_149(123)

   Таким образом если мы знаем что инфоблок S3 связан с таблицей постов и хотим получить все свойства поста 63, делаем:

   IblockElementPropS3.find_by_post_id(63).iblock_element.properties

3. IblockElement.properties выдает хеш соответсвия кодов свойств и названия их полей в prop_s
   Автоматическое определение привязки элемента к объекту. Например: если мы спрашиваем iblock_element.post
то он ищет ключ :post_id в свойствах элемента, и если находит, то возвращает Post.find_by_id(properties[:post_id])

4. Все свойства IblockProperty кешируются и доступны через find(id)

5. В IblockElement автоматически добавляются has_one :iblock_element_prop_s* и has_many :iblock_element_prop_m* при создании соответвующих классов.

6. Модель можно расширять инфоблоком с помощью:

   class Post << ActiveRecord::Base

     has_infoblock(3, :property_19) # где property_19 поле ссылающееся на Post

   Создастся класс Post::Elemnt наследуемый от IblockElement

   для этой модели автоматически создадутся ассоциации

     :iblock_element - класс Post::Element

   Класс PostElement будет иметь ассоциации

    :property_set (он же iblock_element_prop_sNUMBER) и
    :m_prop_values

    а также default_scope с номером инфоблока, поэтому Post::Element.all выдаст только элементы к специфичному инфоблоку

== Примерчики:

=== Хеш кодов свойств инфоблока и их идентификаторов

    Iblock.get_property_codes(3)
    # => {:blog_id=>9, :glob_class=>11, :post_id=>13, :post_cafe=>15, :post_analitik=>16, :post_type=>17, :anonim=>18, :file=>20, :status=>21, :auto_rubric=>37, :link_change=>38, :link_company=>123, :post_kitchen=>124, :analyst=>152, :post_toilet=>193, :theme=>280, :post_analitik_bloger=>290, :num_comments=>309, :cnt_thanks=>327, :preview_mpage=>341, :name2=>342, :cnt_complaint=>349, :pr_subscribe=>410, :was_published=>421, :vip_subscribe=>422, :post_skyline=>430, :vip_send_date=>438}

    # Тоже что и
    Iblock.find(3).property_codes

=== Кешированный список всех свойств инфоблока хешем с ключом-идентификатором

    Iblock.get_properties(3)

    # Тоже самое
    Iblock.find(3).get_properties(3)[13]
    # => #<IblockProperty id: 13, timestamp_x: "2009-12-17 18:13:59", iblock_id: 3, name: "ID Поста", active: "Y", sort: 600, code: "POST_ID", default_value: "", property_type: "N", row_count: 1, col_count: 30, list_type: "L", multiple: "N", xml_id: nil, file_type: "", multiple_cnt: 5, tmp_id: nil, link_iblock_id: 0, with_description: "N", searchable: "N", filtrable: "Y", is_required: "Y", version: 2, user_type: nil, user_type_settings: nil>

=== Конретное свойство

    Iblock.get_property(ibock_id, property_id)

    # Тоже самое
    Iblock.find(3).get_property(13).code
    # => :post_id


=== Битрикс-авторизация

== mysql2_downcase

Подключать просто:

    development:
      adapter: mysql2_downcase
      encoding: cp1251
      ...

== Тесты

    bundle exec guard

или

    bundle exec rake test

== TODO

* Больше примернов использования
* Спеки

== Contributing to bitrix_on_rails

* С нетерпением жду форков, пулеквестов, замечаний и предложений.

== Разработчики

<NAME>, <NAME>

== Copyright

Copyright (c) 2011 Red Green Development. See LICENSE.txt for
further details.

<commit_msg>Edited README.rdoc via GitHub<commit_after>= bitrix_on_rails

Приблуды для использования под рельсами базы 1С:Битрикс.

Для каждого инфоблока что лежит в b_iblock есть своя таблица название которой с номером инфоблока, например b_iblock_element_prop_s7
prop_s - для одиночных свойтсв, prop_m - для множестенный.
У каждого инфоблока нескоолько секций (iblock_section), в каждой секции несколько элементов (iblock_element) у каждого элемента разные свойства которые лежат в prop_s/_m.
Соответсвенно я эти свойства вытащил в одно место - они все доступны из модели IblockElement. Или напрямую; IblockElement.find(123).НАЗВАНИЕ_СВОЙСТВА или через метод properties

== Установка

   gem 'bitrix_on_rails'


В файл `config/initialize/bitrix_on_rails.rb` впишите:

   BitrixOnRails.init

== Что есть:

=== mysql2_downcase адаптер
1. Адаптер mysql2_downcase для автоматической конвертации заглавных наименований полей в прописные.

=== Инфоблоки

Для создания модели элемента инфоблока:  
- наследуем модель от IblockElement  
- в конце файла добавляем BitrixOnRails.send :create_iblock_class, _номер_инфоблока_, _имя_модели_ unless Rails.application.config.cache_classes  
- в config/initializers/bitrix_on_rails.rb в блок BitrixOnRails.configure добавляем c.infoblock _номер_инфоблока_, :extended_class => _имя_модели_  
Далее работаем с инфоблоком, как с обычной моделью.

1. Все модели для таблиц b_iblock_*
2. Автоматическая установка свойств из таблиц prop_s*/prop_m* в методы объекта IblockElement.
   Например IblockElement.find(1).name_emittents, где name_emittent - свойство из prop_s.
   Все подобные свойства также доступны через метод IblockElement#properties.

3. IblockElementS*
 1. Тоже самое и для моделей IblockElementPropertyS*, плюс в них значения полей можно еще и устанавливать:

   p = IblockElementPropertyS3.find(1)
   p.name_emittents='новое имя'
   p.save

 2. Поиск по кодовым названиям полей таблицы

   IblockElementPropertyS3.find_by_post_id(123)

   вместо

   .find_by_property_149(123)

   Таким образом если мы знаем что инфоблок S3 связан с таблицей постов и хотим получить все свойства поста 63, делаем:

   IblockElementPropS3.find_by_post_id(63).iblock_element.properties

3. IblockElement.properties выдает хеш соответсвия кодов свойств и названия их полей в prop_s
   Автоматическое определение привязки элемента к объекту. Например: если мы спрашиваем iblock_element.post
то он ищет ключ :post_id в свойствах элемента, и если находит, то возвращает Post.find_by_id(properties[:post_id])

4. Все свойства IblockProperty кешируются и доступны через find(id)

5. В IblockElement автоматически добавляются has_one :iblock_element_prop_s* и has_many :iblock_element_prop_m* при создании соответвующих классов.

6. Модель можно расширять инфоблоком с помощью:

   class Post << ActiveRecord::Base

     has_infoblock(3, :property_19) # где property_19 поле ссылающееся на Post

   Создастся класс Post::Elemnt наследуемый от IblockElement

   для этой модели автоматически создадутся ассоциации

     :iblock_element - класс Post::Element

   Класс PostElement будет иметь ассоциации

    :property_set (он же iblock_element_prop_sNUMBER) и
    :m_prop_values

    а также default_scope с номером инфоблока, поэтому Post::Element.all выдаст только элементы к специфичному инфоблоку

== Примерчики:

=== Хеш кодов свойств инфоблока и их идентификаторов

    Iblock.get_property_codes(3)
    # => {:blog_id=>9, :glob_class=>11, :post_id=>13, :post_cafe=>15, :post_analitik=>16, :post_type=>17, :anonim=>18, :file=>20, :status=>21, :auto_rubric=>37, :link_change=>38, :link_company=>123, :post_kitchen=>124, :analyst=>152, :post_toilet=>193, :theme=>280, :post_analitik_bloger=>290, :num_comments=>309, :cnt_thanks=>327, :preview_mpage=>341, :name2=>342, :cnt_complaint=>349, :pr_subscribe=>410, :was_published=>421, :vip_subscribe=>422, :post_skyline=>430, :vip_send_date=>438}

    # Тоже что и
    Iblock.find(3).property_codes

=== Кешированный список всех свойств инфоблока хешем с ключом-идентификатором

    Iblock.get_properties(3)

    # Тоже самое
    Iblock.find(3).get_properties(3)[13]
    # => #<IblockProperty id: 13, timestamp_x: "2009-12-17 18:13:59", iblock_id: 3, name: "ID Поста", active: "Y", sort: 600, code: "POST_ID", default_value: "", property_type: "N", row_count: 1, col_count: 30, list_type: "L", multiple: "N", xml_id: nil, file_type: "", multiple_cnt: 5, tmp_id: nil, link_iblock_id: 0, with_description: "N", searchable: "N", filtrable: "Y", is_required: "Y", version: 2, user_type: nil, user_type_settings: nil>

=== Конретное свойство

    Iblock.get_property(ibock_id, property_id)

    # Тоже самое
    Iblock.find(3).get_property(13).code
    # => :post_id


=== Битрикс-авторизация

== mysql2_downcase

Подключать просто:

    development:
      adapter: mysql2_downcase
      encoding: cp1251
      ...

== Тесты

    bundle exec guard

или

    bundle exec rake test

== TODO

* Больше примернов использования
* Спеки

== Contributing to bitrix_on_rails

* С нетерпением жду форков, пулеквестов, замечаний и предложений.

== Разработчики

<NAME>, <NAME>

== Copyright

Copyright (c) 2011 Red Green Development. See LICENSE.txt for
further details.


{'fraction_non_alphanumeric': 0.08744866272663528, 'fraction_numerical': 0.031453470900530904, 'mean_word_length': 5.117647058823529, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 70, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3565181', 'n_tokens_mistral': 4134, 'n_tokens_neox': 4289, 'n_words': 968}