私はチェックされた属性でオブジェクトを見つけるためにユーザが使用できる一連のチェックボックスを持っています。私はそれらが多くの属性を選択して、すべてを含むオブジェクトのリストを表示できるようにしたいと思います。これらの属性がチェックされています。Railsオブジェクトの配列を持つActiverecordクエリは、複数のオブジェクトの複製を返します。
1つの属性をチェックしてリストを指定して、以前のチェックですでに表示されていた別の属性をチェックした後、もう1つのコピーがあるという点を除いて、ここには何が起こっているのかのイメージがあります。オブジェクトが繰り返されていることに注目してください。ここで
それで行くのコードです:
<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
注意。私はあなたがそれを保持しているデータをよりわかりやすいものに改名することを強くお勧めします。 'Object'は、Rubyの最も基本的なクラスの名前です。モデルとして使用すると、名前空間の微妙な衝突が起こり、非常に奇妙な動作をする可能性があります。私はあなたの現在の問題に関連しているとは思っていませんが、そうかもしれません。 – Glyoko
これは私が取り組んでいるデータをあいまいにするために行われました。それは本当に 'オブジェクト'と呼ばれていません – Antonio
さて、それでも気にしないでください。私は実際に、ActiveRecord :: Baseを最初に継承するオブジェクトをどのように管理するのかと疑問に思っていました。 – Glyoko