Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中将SQL查询转换为自定义关系查询_Ruby On Rails_Sqlite_Has Many Through_Self Join_Thesaurus - Fatal编程技术网

Ruby on rails 在Rails中将SQL查询转换为自定义关系查询

Ruby on rails 在Rails中将SQL查询转换为自定义关系查询,ruby-on-rails,sqlite,has-many-through,self-join,thesaurus,Ruby On Rails,Sqlite,Has Many Through,Self Join,Thesaurus,我正在尝试在Rails中构建一个简单的同义词库应用程序,在这个应用程序中,单词表中的一个单词将通过同义词对的joiner表与表中的其他单词具有许多自连接的关系 我的同义词对类构建如下: 类同义词对

我正在尝试在Rails中构建一个简单的同义词库应用程序,在这个应用程序中,单词表中的一个单词将通过同义词对的joiner表与表中的其他单词具有许多自连接的关系

我的同义词对类构建如下:

类同义词对end您可能正在寻找ActiveRecord类方法:

类同义词对word{whereword1:word.orwhereword2:word} 终止 类Word单词do pairs=同义词pair.with_wordword whereid:pairs.选择:word1\u id.where.notid:word.id.或 whereid:pairs.选择:word2\u id.where.notid:word.id 终止 def同义词 同义词 终止 终止
您可能正在寻找ActiveRecord类方法:

类同义词对word{whereword1:word.orwhereword2:word} 终止 类Word单词do pairs=同义词pair.with_wordword whereid:pairs.选择:word1\u id.where.notid:word.id.或 whereid:pairs.选择:word2\u id.where.notid:word.id 终止 def同义词 同义词 终止 终止
您可以创建标准M2M联接表,而不是同义词对表:

class Word
  has_many :synonymities
  has_many :synonyms, though: :synonymities
end

您可以创建标准M2M联接表,而不是同义词对表:

class Word
  has_many :synonymities
  has_many :synonyms, though: :synonymities
end

如果确实要设置关联,其中记录可以位于联接表的任一列中,则需要为每个可能的外键设置一个有多个关联和一个间接关联

请耐心听我说,这太疯狂了:

class Word < ActiveRecord::Base
  has_many :synonym_pairs_as_word_1, 
   class_name: 'SynonymPair',
   foreign_key: 'word_1'

  has_many :synonym_pairs_as_word_2, 
   class_name: 'SynonymPair',
   foreign_key: 'word_2'

  has_many :word_1_synonyms, 
   through: :synonym_pairs_as_word_1,
   class_name: 'Word', 
   source: :word_2

  has_many :word_2_synonyms, 
   through: :synonym_pairs_as_word_2,
   class_name: 'Word',
   source: :word_1

  def synonyms
    self.class.where(id: word_1_synonyms).or(id: word_2_synonyms)    
  end
end
由于这里的同义词仍然不是真正的关联,因此,如果要加载单词及其同义词的列表,则仍然存在潜在的n+1查询问题


虽然您可以快速加载word\u 1\u同义词和word\u 2\u同义词,并通过强制转换为数组将它们组合在一起,但如果您需要对记录进行排序,这会带来一个问题。

如果您确实想设置关联,其中记录可以位于联接表的任一列中,则需要为每个潜在值设置一个多关联和一个间接关联外键

请耐心听我说,这太疯狂了:

class Word < ActiveRecord::Base
  has_many :synonym_pairs_as_word_1, 
   class_name: 'SynonymPair',
   foreign_key: 'word_1'

  has_many :synonym_pairs_as_word_2, 
   class_name: 'SynonymPair',
   foreign_key: 'word_2'

  has_many :word_1_synonyms, 
   through: :synonym_pairs_as_word_1,
   class_name: 'Word', 
   source: :word_2

  has_many :word_2_synonyms, 
   through: :synonym_pairs_as_word_2,
   class_name: 'Word',
   source: :word_1

  def synonyms
    self.class.where(id: word_1_synonyms).or(id: word_2_synonyms)    
  end
end
由于这里的同义词仍然不是真正的关联,因此,如果要加载单词及其同义词的列表,则仍然存在潜在的n+1查询问题


虽然您可以快速加载word\u 1\u同义词和word\u 2\u同义词,并通过强制转换为数组将它们组合在一起,但如果需要对记录进行排序,则会出现问题。

您需要指出同义词属于word类。还有很多:同义词,类名:Word,through::同义词_pairs@LesNightingill只有当关联指向表中的一个关联时,这才有效。您需要指出同义词属于单词类。还有很多:同义词,类名:Word,through::同义词_pairs@LesNightingill只有当关联指向表中的一个关联时,这才起作用。作用域的问题是它们不是关系,不能立即加载。这可能会导致一些相当严重的性能问题。作用域的问题是它们不是关系,不能立即加载。这可能会导致一些相当严重的性能问题。同义词对表已经是M2M连接表了,为什么还要创建另一个呢?@eikes我更改了名称和内容,以便更清楚地了解这里发生的事情。该表实际上不是作为成对表进行查询的。而是每对有两行,每个方向一行。因此,这是一个非常不同的解决方案。您需要将每一对添加两次。不是最优的。这可能会导致一些相当严重的性能问题。作者特别指出:这个同义词库程序的一个关键方面是,不管一个单词是在word1还是word2列中,它都不应该是重要的;word1是word2的同义词,反之亦然。@eikes在回答中写道,这是一种折衷。但是缺少对备选方案的快速加载将是一个更直接的性能问题。同义词对表已经是M2M联接表了,为什么还要创建另一个呢?@eikes我更改了名称和内容,以使这里发生的事情更加明显。该表实际上不是作为成对表进行查询的。而是每对有两行,每个方向一行。因此,这是一个非常不同的解决方案。您需要将每一对添加两次。不是最优的。这可能会导致一些相当严重的性能问题。作者特别指出:这个同义词库程序的一个关键方面是它不应该
无论单词是在word1还是word2列中;word1是word2的同义词,反之亦然。@eikes在回答中写道,这是一种折衷。但是缺少对替代方案的快速加载将是一个更直接的性能问题。
irb(main):019:0> happy.synonyms
  Word Load (0.3ms)  SELECT "words".* FROM "words" INNER JOIN "synonymities" ON "words"."id" = "synonymities"."synomym_id" WHERE "synonymities"."word_id" = $1 LIMIT $2  [["word_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Word id: 2, text: "Jolly", created_at: "2020-07-06 09:00:43", updated_at: "2020-07-06 09:00:43">]>
irb(main):020:0> jolly.synonyms
  Word Load (0.3ms)  SELECT "words".* FROM "words" INNER JOIN "synonymities" ON "words"."id" = "synonymities"."synomym_id" WHERE "synonymities"."word_id" = $1 LIMIT $2  [["word_id", 2], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Word id: 1, text: "Happy", created_at: "2020-07-06 09:00:32", updated_at: "2020-07-06 09:00:32">]>
class Word < ActiveRecord::Base
  has_many :synonym_pairs_as_word_1, 
   class_name: 'SynonymPair',
   foreign_key: 'word_1'

  has_many :synonym_pairs_as_word_2, 
   class_name: 'SynonymPair',
   foreign_key: 'word_2'

  has_many :word_1_synonyms, 
   through: :synonym_pairs_as_word_1,
   class_name: 'Word', 
   source: :word_2

  has_many :word_2_synonyms, 
   through: :synonym_pairs_as_word_2,
   class_name: 'Word',
   source: :word_1

  def synonyms
    self.class.where(id: word_1_synonyms).or(id: word_2_synonyms)    
  end
end