Тебе даже не нужен простор для этого.Проверьте это:
Piece.includes([:topic, :audience]).where(['`topics`.name = ?', 'Politics'])
С Rails 3 & Arel большинство областей совершенно не нужны.
При использовании этого в представлениях без создания новых действий контроллера вы можете настроить некоторые условия с помощью параметровпередается в действие индекса, чтобы определить, как выполнить запрос.
Например: (и это пример грубый , непроверенный , но это должен работать)
app / controllers /iece_controller.rb:
class PieceController < ApplicationController
def index
case params[:find_by]
when 'topic_name'
@pieces = Piece.includes([:topic, :audience]).where(['`topics`.name = ?', params[:topic_name])
when 'topic_id'
@pieces = Piece.includes([:topic, :audience]).where(['`topics`.id = ?', params[:topic_id])
else
@pieces = Piece.all
end
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @addressees }
end
end
# ...
end
app / views /iece / index.html.erb:
<%= link_to 'Politics Pieces', :controller => 'pieces', :find_by => 'topic_name', :topic_name => 'Politics' %>
Другой пример использования поля выбора и JavaScript:
app / views / piece / index.html.erb:
<%= select 'find_by', 'topic', find_by_topic_select_options %>
app / helpers / parts_helper.rb: (перемещена ссылка здесь для удобства чтения)
module PieceHelper
def find_by_topic_select_options
Topic.all.collect do |topic|
url = url_for :controller => 'pieces', :find_by => 'topic_id', :topic_id => topic.id
[topic.name, url]
end
end
end
public / javascripts / application.js:
window.onload = (function (ev) {
var find_by_topic_select = document.getElementById('find_by_topic');
find_by_topic_select.onchange = (function (e) {
var selected = this.options[this.selectedIndex];
window.location = selected.value;
});
});
И, сноска, вы не link_to
ассоциация или структура данных.Вы ссылаетесь на URL или маршрут, который вызывает действие (которое отображает представление), которое соответствующим образом отображает вашу структуру данных.Я надеюсь, что это прояснит для вас.