Ruby多连接

时间:2017-08-10 20:57:45

标签: ruby-on-rails join activerecord

以下是我在Rails应用程序中创建的模型:

class Pet < ActiveRecord::Base
  belongs_to :shelter
  belongs_to :type
end

class Shelter < ActiveRecord::Base
  has_many :pets
end

class Type < ActiveRecord::Base
  has_many :pets
end

我试图寻找那些没有异国宠物的庇护所,但却被困在桌子上以便能找到那些信息!这是我最近的尝试,我相信我至少可以到达Types表。任何关于连接的帮助和解释都将非常感谢!

Shelter.joins(:pet => :type).where(:types => {exotic => false})

1 个答案:

答案 0 :(得分:0)

我相信只用JOINS就不可能得到你想要的结果。相反,你需要找到哪些庇护所有异国情调的宠物,然后否定它。

实现这一目标的一种方法是通过子查询:

my $file = "apache_log.log";
my $file2 = "apache_log1.log";
my %hrec;
open (FH, "$file");
open(DATA, ">$file2");
my $str;
while (my $line = <FH>) {
chomp $line;
if  ( $line =~ /^(\d{1,}\.\d{1,}\.\d{1,}\.\d{1,})\s+\-\s+\-\s+\[\d{1,}\/\w+\/\d{1,}\:\d{1,}\:\d{1,}\:\d{1,}\s+\+0000\]\s+\"(PUT|GET|POST|DELETE)/)   {
print DATA "$1: $2\n";
}
close(DATA);
close(FH);
open(DATA, "$file2") or die "Couldn't open file $file2, $!";
while ( my $str = <DATA>) {
my @requests = split ('\n',$str);
foreach my $req(@requests) {
$hrec{$req}++;
 }
 }
close(DATA);
foreach my $fam ( sort keys %hrec) {
print "$fam =". ($hrec{$fam})."\n";
}

当然,这涉及很多明确的SQL,我不介意,但其他人不喜欢它。

您也可以使用ActiveRecord查询界面执行类似操作。

Shelter.where(<<~SQL)
  NOT EXISTS (
    SELECT 1 FROM pets 
    INNER JOIN types ON types.id = pets.type_id 
    WHERE shelters.id = pets.shelter_id 
      AND types.exotic IS TRUE
  )
SQL

注意:两个示例的查询不同。如果它很重要,你需要对它们进行基准测试,以确定哪一个表现最佳。