1

안녕하세요. link에 따라 closure_tag gem을 설정했습니다.굉장한 중첩 된 세트 대신 Closure_tree gem 사용

"질량 수 없습니다 : 나는 다음과 같은 방법으로 (대신 newStructure.move_to_child_of (부모)의 newStructure.find_or_create_by_path (부모)) closure_tree 구문을 사용하려고

... 다음 오류가 발생했습니다 보호 된 속성을 지정하십시오 : 조상, 자손, 세대 "

이 방법은 newStructure.find_or_create_by_path (부모)를 사용하는 올바른 방법입니까?

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") ... 사용하려고해도 NoMethodError (#FileOrFolder : 0x에 대한 정의되지 않은 메소드'new ') – Vinay

+0

@GabrielMazetto 당신도이 오류에 직면 했습니까? 4.2.1 버전에서도 사용하려고하면이 오류가 발생합니다. – Vinay

답변

1

저는 closure_tree의 저자입니다. 4.2.3은 attr_accessible에 대한 수정과 함께 진행됩니다. 트래비스가 테스트를 끝내기를 기다리고 있습니다. 전체 import 방법이 라인으로 대체 될 수 있었던 것처럼

같습니다 :

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 디렉토리에서 봐 주시기 바랍니다 : 이것은 당신이 FileOrFolder 설정을 가정

# 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 

. 의 다른 예를 찾을 수 있습니다.

+0

@mrm ... 답장을 보내 주셔서 감사합니다. ... 당신이 언급 한 변경 사항을 만들었습니다 .. 예상대로 항목이 추가되고 있습니다. 전체 경로가 올바르게 채워지지 않았습니다 ..... 열이 테이블에서 비어 있습니다 ... 도움을주십시오. – Vinay

+0

내 게시물을 수정하여 데이터베이스 항목을 포함했습니다 ... 이러한 변경 후! – Vinay

+0

답변을 업데이트하십시오. 시도해보십시오. – mrm