2017-02-28 6 views
1

私はチェックされた属性でオブジェクトを見つけるためにユーザが使用できる一連のチェックボックスを持っています。私はそれらが多くの属性を選択して、すべてを含むオブジェクトのリストを表示できるようにしたいと思います。これらの属性がチェックされています。Railsオブジェクトの配列を持つActiverecordクエリは、複数のオブジェクトの複製を返します。

1つの属性をチェックしてリストを指定して、以前のチェックですでに表示されていた別の属性をチェックした後、もう1つのコピーがあるという点を除いて、ここには何が起こっているのかのイメージがあります。オブジェクトが繰り返されていることに注目してください。ここで

enter image description here

それで行くのコードです:

<div class="col-md-2"> 
    <div class="dropdown package-dropdown"> 
     <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Attributes</button> 
     <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton"> 
     <li><a href="#" class="small" data-value="attr1" tabIndex="-1"><input type="checkbox"/>attr1</a></li> 
     <li><a href="#" class="small" data-value="attr2" tabIndex="-1"><input type="checkbox"/>attr2</a></li> 
     <li><a href="#" class="small" data-value="attr3" tabIndex="-1"><input type="checkbox"/>attr3</a></li> 
     <li><a href="#" class="small" data-value="attr4" tabIndex="-1"><input type="checkbox"/>attr4</a></li> 
     <li><a href="#" class="small" data-value="attr5" tabIndex="-1"><input type="checkbox"/>attr5</a></li> 
     </ul> 
    </div> 
</div> 

<!-- removed irrelevant code for brevity --> 

    <tbody id="hits"> 
    <% @objects.each do |obj| %> 
     <tr> 
     <td><%= link_to obj.title, obj_path(obj) %></td> 
      <td class="package-column"> 
      <% if obj.packages.any? %> 
      <div> 
      <% obj.packages.each do |p| %> 
       <span><%= image_tag "needs-#{p.kind}", :alt => "#{p.kind}", :class => "foobar" %></span> 
      <% end %> 
      </div> 
      <% else %> 
      <div class="package-column"><span>...</span></div> 
     <% end %> 
     </td> 
     <td><%= obj.capacity %></td> 
     <td><%= obj.started_at.strftime('%A, %B %e, %Y at %l:%M %p') if obj.started_at? %></td> 
     </tr> 
    <% end %> 
    <tr><td colspan="4" align="center"><%= link_to "Load More", objects_path, class: "load-more" %></td></tr> 
    </tbody> 
</table> 

var options = []; 
$('.dropdown-menu li a').on('click', function(event) { 
var $target = $(event.currentTarget), 
    val = $target.attr('data-value'), 
    $inp = $target.find('input'), 
    idx; 

if ((idx = options.indexOf(val)) > -1) { 
    options.splice(idx, 1); 
    setTimeout(function() { $inp.prop('checked', false) }, 0); 
} else { 
    options.push(val); 
    setTimeout(function() { $inp.prop('checked', true) }, 0); 
} 

$(event.target).blur(); 

    console.log(options); 
    $.ajax({ 
    url: $(this).attr('href'), 
    type: "GET", 
    data: { 
     packages: options 
    }, 
    dataType: "script" 
    }) 
    return false; 
}); 

アクティブレコードクエリがある私のコントローラ。

def index 
    if params[:packages] 
    packages = params[:packages] # ["attr1", "attr3" etc..] 
    @objects = Object.joins(:packages).where("packages.kind IN (?)", packages) 
    end 

    respond_to do |format| 
    format.html 
    format.js 
    end 
end 

私は@objectsを調べる場合、私はそうのように、レコードの複数のコピーを示していますので、私はそれはActiveRecordの問題ではなく、表示の問題だと確信しています:

[8] pry(#<ObjectsController>)> @objects 
=> [#<Object:0x007f991cb1d6b0 
    id: 2, 
    uuid: "1adede0e-8585-41a5-8c74-8de8eec6a141", 
    name: "andy-title1", 
    title: "Andy - Title1", 
    started_at: Mon, 27 Mar 2017 13:00:24 PDT -07:00, 
    ended_at: Mon, 27 Mar 2017 18:00:24 PDT -07:00 
#<Object:0x007f991cb1d548 
    id: 2, 
    uuid: "1adede0e-8585-41a5-8c74-8de8eec6a141", 
    name: "andy-title1", 
    title: "Andy - Title1", 
    started_at: Mon, 27 Mar 2017 13:00:24 PDT -07:00, 
    ended_at: Mon, 27 Mar 2017 18:00:24 PDT -07:00 
+1

注意。私はあなたがそれを保持しているデータをよりわかりやすいものに改名することを強くお勧めします。 'Object'は、Rubyの最も基本的なクラスの名前です。モデルとして使用すると、名前空間の微妙な衝突が起こり、非常に奇妙な動作をする可能性があります。私はあなたの現在の問題に関連しているとは思っていませんが、そうかもしれません。 – Glyoko

+0

これは私が取り組んでいるデータをあいまいにするために行われました。それは本当に 'オブジェクト'と呼ばれていません – Antonio

+1

さて、それでも気にしないでください。私は実際に、ActiveRecord :: Baseを最初に継承するオブジェクトをどのように管理するのかと疑問に思っていました。 – Glyoko

答えて

1

は、私のクエリの最後に.distinctを追加します私の問題を解決し、重複レコードを省略します。

私の今働いてクエリがある:これはそれを修正しますが、問題は、あなたのモデルが `Object`と呼ばれているという事実に関係することができるかどうかわから

@objects = Object.joins(:packages).where("packages.kind IN (?)", packages).distinct

+0

私は、いくつかのケースでは重複を返すことができるSQL結合の奇抜だと思います。あなたの解決策を使用してここで正しいようです。 – Glyoko

関連する問題