Ну, 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 }