ROR: выбор из нескольких таблиц - PullRequest
1 голос
/ 27 ноября 2010

У меня есть две таблицы: интересы и Link_ui (это для записи пользователей и интересов)
Я хочу ввести идентификатор пользователя и показать все интересы, которые есть у пользователя.

В контроллере Link_ui:

 def output
    @interests = LinkUi.find_by_sql [ 'SELECT interests.name FROM link_uis, interests
    WHERE link_uis.interest_id = interests.id AND link_uis.user_id=? ', params['user_id'] ]

И страница ввода:

<%= form_tag :action => 'output', :method => 'post' %>
  enter id.
  <%= text_field_tag ':user_id', '', 'size' => 30 %>

Ничего не выходит, но я уверен, что в базе данных есть совпадающие данные. И если я не введу параметр, просто установите link_uis.user_id = 1, он получится:

your search are [#<LinkUi >, #<LinkUi >, #<LinkUi >, #<LinkUi >]

Что не так с этим ..

1 Ответ

4 голосов
/ 28 ноября 2010

Ну, find_by_sql в модели LinkUi ожидает, что вы вернете столбцы из таблицы link_uis, тогда как вы выбираете просто interests.name.Тем не менее, вы вступаете в битву с ActiveRecord.:)

Вы обычно хотите избежать find_by_sql, и вместо этого позволить ActiveRecord сгенерировать ваш SQL для вас.Вероятно, наиболее важными для вашего примера являются ассоциации.

На мой взгляд, у вас есть группа Users и группа Interests .Ваш LinkUis связывает эти два элемента вместе ( LinkUi принадлежит Пользователю и Процентам ).Не стесняйтесь поправлять меня в этом;это ваша бизнес-логика, как я понял из вашего примера.

Эти классы (имена которых я выделил) - это ваши модели, определенные в каталоге app/models.Связи (отношения) между ними должны быть определены в этих классах.


Начало с простой ассоциации в вашей Пользовательской модели:

class User < ActiveRecord::Base
  has_many :link_uis
end

Ив вашей Проценте модели:

class Interest < ActiveRecord::Base
  has_many :link_uis
end

Затем модель LinkUi , которая связывает ее вместе:

class LinkUi < ActiveRecord::Base
  belongs_to :user
  belongs_to :interest
end

Теперь, если дано любое Пользователь , вы можете получить его / ее LinkUis , просто сказав user.link_uis.all, и для каждого LinkUi вы можете получить Проценты как link_ui.interest.Вы можете указать ActiveRecord, чтобы он выбирал эти два в одном кадре максимально эффективно, используя :include, и получал список имен Interest , используя стандартный метод Ruby collect.Затем он становится:

user = User.find params['user_id']
link_uis = user.link_uis.all(:include => :interest)
interest_names = link_uis.collect { |link_ui| link_ui.interest.name }

Вы можете сделать это еще на один шаг вперед;для любого пользователя вы можете напрямую получить его / ее интересов .После того, как вы настроили вышеупомянутые ассоциации, вы можете сложить два «шага» в один, например:

class User < ActiveRecord::Base
  has_many :link_uis
  has_many :interests, :through => :link_uis
end

, что может превратить пример в этот однострочный:

interest_names = User.find(params[:user_id]).interests.collect { |i| i.name }
...