2010-06-30 3 views
0

Как изменить поведение по умолчанию для модели activerecord для метода find? Например, я хочу, чтобы найти все книги внутри базы данных Друпали узлы, но Друпали использует только одну таблицу для всех данных, и использует столбец «типа», чтобы узнать типСоздание модели AR для базы данных Drupal

class Book < ActiveRecord::Base 
    set_table_name 'node' 

    def find(*args) 
    :conditions => {:type => 'book'} 
    super 
    end 
end 

это правильный подход Для решения этой проблемы?

+0

Вы используете CCK (содержание комплекта contstruction , также известный как content.module)? В этом случае ваши таблицы будут намного более динамичными. – berkes

+0

Да, в этом типе узла есть поля cck. Но, например, я просто пытался получить узлы книги. Я планировал написать плагин rails, что-то вроде act_as_drupal_node – vrsmn

ответ

1

Я решил это создание модели для узла и использования named_scopes

результат был этот

class Node 
    set_table_name 'node' 
    set_primary_key 'nid' 
    named_scope :book, :conditions => {:type => 'book'} 

    # if i don't overwrite this method, i would get an error when i try to use the type column 
    def self.inheritance_column 
    "rails_type" 
    end 
end 

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

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

@books = Node.book.all 
+0

В вашем случае я буду использовать ** books ** как имя области видимости, а в Rails 3 вы можете использовать 'scope' not' named_scope' –

Смежные вопросы