Используйте select (), чтобы назвать нужные столбцы.По крайней мере, это работает в Rails 3.0.9.
Справочная информация: у моего приложения есть основная таблица с именем: rights.Я хотел, чтобы можно было присвоить тег и цвет данной правильной записи, чтобы я мог легко выбрать ее из списка индексов.Это не совсем соответствует картине Rails связанных записей;Большинство: права никогда не будут помечены, и теги являются абсолютно произвольными (пользовательский ввод через тег / редактирование).
Я мог бы попытаться дублировать данные тега в записи: right, но это нарушает нормальную форму.Или я мог бы попробовать запросить теги для каждой записи: right, но это крайне неэффективный подход.Я хочу иметь возможность присоединиться к таблицам.
Консоль MySQL показывает:
mysql> describe rights;
+------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
...
| Tagid | int(11) | YES | | NULL | |
+------------+---------------+------+-----+---------+----------------+
mysql> describe tags;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| TagName | varchar(255) | YES | | NULL | |
| TagColor | varchar(255) | YES | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
Я собираюсь использовать TagName и TagColor в views / rights / index.html.erb, поэтому яхотите, чтобы контроллер прав включил эти столбцы в объект @rights, который он передает представлению.Так как не у каждого: right есть тег:, я хочу использовать внешнее объединение:
@rights = Right.joins("LEFT OUTER JOIN tags ON rights.Tagid = tags.id")
Но, как обнаружили все, это само по себе не работает: ссылка на TagName блока приводит к ошибке сервера,Однако, если я добавлю выбор в конце, все будет хорошо:
@rights = Right.joins("LEFT OUTER JOIN tags ON rights.Tagid = tags.id").select("rights.*,tags.TagName as TagName,tags.TagColor as TagColor")
Примечание добавлено 6/7/13: предложение select не требует псевдонимов - это тоже работает:
.select("rights.*,tags.TagName,tags.TagColor")
Теперь я могу ссылаться на TagName и TagColor в моем представлении:
<% @rights.each do |right| %>
<tr ALIGN=Left <%=
# color background if this is tagged
" BGCOLOR=#{right.TagColor}" if right.TagColor
%> > ...
<% end %>