1

Привет, я следовал за link, чтобы настроить жемчужину cap_tag.Использование Closure_tree gem вместо Awesome вложенного набора

Когда я пытался использовать closure_tree синтаксис следующим образом (newStructure.find_or_create_by_path (родитель) вместо newStructure.move_to_child_of (родительского)) ... получил следующее сообщение об ошибке:

«Не масс- назначить защищенные атрибуты: предок, потомок, поколения "

Это правильный способ использования newStructure.find_or_create_by_path (parent)?

def self.import(path) 

    newStructure = FileOrFolder.find(:first, :conditions=>["fullpath = ?", path]) 
    if newStructure 
     return newStructure 
    end 

    newStructure = FileOrFolder.new 
    newStructure.fullpath = path 
    pathbits = path.split('/') 
    newStructure.name = pathbits.last 
    newStructure.save 




    parentpath = path.sub(/#{Regexp.escape(pathbits.last)}$/, '') 
     if parentpath.length > 1 
      parentpath.sub!(/\/$/,'') 
      parent = FileOrFolder.find(:first, :conditions=>["fullpath = ?", parentpath]) 
      unless parent 
      parent = FileOrFolder.import(parentpath) 
      end 
      #newStructure.move_to_child_of(parent); 
      **newStructure.find_or_create_by_path(parent);** 
     end 
     newStructure.save 
     return newStructure 

     end 






database table looks like : 

mysql> select * from testdb7.file_or_folders limit 10; 
+------+-----------+------+------+----------+------------------------+---------------------+---------------------+ 
| id | parent_id | lft | rgt | fullpath | name     | created_at   | updated_at   | 
+------+-----------+------+------+----------+------------------------+---------------------+---------------------+ 
| 6901 |  NULL | NULL | NULL | NULL  |      | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
| 6902 |  6901 | NULL | NULL | NULL  | devel     | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
| 6903 |  6902 | NULL | NULL | NULL  | Bcontrol    | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
| 6904 |  6903 | NULL | NULL | NULL  | perfect    | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
| 6905 |  6904 | NULL | NULL | NULL  | matlab     | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
| 6906 |  6905 | NULL | NULL | NULL  | test     | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
| 6907 |  6906 | NULL | NULL | NULL  | smoke     | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
| 6908 |  6907 | NULL | NULL | NULL  | Control_System_Toolbox | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
| 6909 |  6908 | NULL | NULL | NULL  | tsmoke_are.m   | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
| 6910 |  6908 | NULL | NULL | NULL  | tsmoke_bode.m   | 2013-06-25 18:49:04 | 2013-06-25 18:49:04 | 
+------+-----------+------+------+----------+------------------------+---------------------+---------------------+ 



FileOrFolder Load (14560.8ms) SELECT `file_or_folders`.* FROM `file_or_folders` INNER JOIN `file_or_folder_hierarchies` ON `file_or_folders`.`id` = `file_or_folder_hierarchies`.`descendant_id` INNER JOIN (
SELECT ancestor_id 
FROM `file_or_folder_hierarchies` 
GROUP BY 1 
HAVING MAX(`file_or_folder_hierarchies`.generations) = 0 
) AS leaves ON (`file_or_folders`.id = leaves.ancestor_id) WHERE `file_or_folder_hierarchies`.`ancestor_id` = 147 ORDER BY `file_or_folder_hierarchies`.generations asc 
    EXPLAIN (13343.7ms) EXPLAIN SELECT `file_or_folders`.* FROM `file_or_folders` INNER JOIN `file_or_folder_hierarchies` ON `file_or_folders`.`id` = `file_or_folder_hierarchies`.`descendant_id` INNER JOIN (
SELECT ancestor_id 
FROM `file_or_folder_hierarchies` 
GROUP BY 1 
HAVING MAX(`file_or_folder_hierarchies`.generations) = 0 
) AS leaves ON (`file_or_folders`.id = leaves.ancestor_id) WHERE `file_or_folder_hierarchies`.`ancestor_id` = 147 ORDER BY `file_or_folder_hierarchies`.generations asc 
EXPLAIN for: SELECT `file_or_folders`.* FROM `file_or_folders` INNER JOIN `file_or_folder_hierarchies` ON `file_or_folders`.`id` = `file_or_folder_hierarchies`.`descendant_id` INNER JOIN (
      SELECT ancestor_id 
      FROM `file_or_folder_hierarchies` 
      GROUP BY 1 
      HAVING MAX(`file_or_folder_hierarchies`.generations) = 0 
     ) AS leaves ON (`file_or_folders`.id = leaves.ancestor_id) WHERE `file_or_folder_hierarchies`.`ancestor_id` = 147 ORDER BY `file_or_folder_hierarchies`.generations asc 
+----+-------------+----------------------------+--------+------------------------------------------------------------------------------------+----------------------------------+---------+--------------------+---------+---------------------------------+ 
| id | select_type | table      | type | possible_keys                  | key        | key_len | ref    | rows | Extra       | 
+----+-------------+----------------------------+--------+------------------------------------------------------------------------------------+----------------------------------+---------+--------------------+---------+---------------------------------+ 
| 1 | PRIMARY  | file_or_folder_hierarchies | ref | index_file_or_folders_on_ans_des,index_file_or_folder_hierarchies_on_descendant_id | index_file_or_folders_on_ans_des | 4  | const    |  15 | Using temporary; Using filesort | 
| 1 | PRIMARY  | <derived2>     | ALL | NULL                    | NULL        | NULL | NULL    | 104704 | Using where; Using join buffer | 
| 1 | PRIMARY  | file_or_folders   | eq_ref | PRIMARY                   | PRIMARY       | 4  | leaves.ancestor_id |  1 | Using where      | 
| 2 | DERIVED  | file_or_folder_hierarchies | index | NULL                    | index_file_or_folders_on_ans_des | 8  | NULL    | 1340096 |         | 
+----+-------------+----------------------------+--------+------------------------------------------------------------------------------------+----------------------------------+---------+--------------------+---------+---------------------------------+ 
+0

У меня такая же ошибка, я думаю, что у 4.2.2 есть ошибка –

+0

, и даже если я попытаюсь использовать ..... grandparent = newStructure.new (: name => "Grandparent") ... i get NoMethodError (undefined method 'new 'для #FileOrFolder: 0x) – Vinay

+0

@GabrielMazetto вы тоже столкнулись с этой ошибкой .... Я получаю эту ошибку, когда я пытаюсь использовать ее с версией 4.2.1, а также – Vinay

ответ

1

Я являюсь автором clos_tree. 4.2.3 находится на своем пути с исправлением для attr_accessible. Я просто жду, пока Тревис закончит его тестирование.

Похоже, весь ваш import метод может быть заменен на этой линии:

# Assumes that path is a string that looks like this: "/usr/local/bin/ruby" 
def import(path) 
    FileOrFolder.find_or_create_by_path(path.split("/")) 
end 

Это предполагает, что вы имеете эту установку FileOrFolder:

class FileOrFolder < ActiveRecord::Base 
    acts_as_tree 
    before_create :set_fullpath 
    def set_fullpath 
    if root? 
     self.fullpath = "/#{name}" 
    else 
     self.fullpath = "/#{parent.ancestry_path.join("/")}/#{name}" 
    end 
    end 
end 

Пожалуйста, обратите внимание на каталог spec. Вы найдете тонн других примеров.

+0

@mrm ... Спасибо за ответ. ... Я внес изменения, которые вы упомянули ... и записи добавляются, как и ожидалось, просто, что полный путь не заполняется правильно ... столбец в таблице пуст ... не могли бы вы помочь. – Vinay

+0

отредактировал мое сообщение, чтобы включить записи базы данных ... после этих изменений! – Vinay

+0

Обновлен ответ, попробуйте это. – mrm