Rails 3 три модели соединяются - PullRequest
0 голосов
/ 26 марта 2011

Мне кажется, по какой-то причине это не так, хотя это звучит просто: /

У меня есть три модели:

User(id,name,email)
Skill(id,name,description)
UserSkill(user_id,skill_id,level)

Как я могу получить все навыкиопределенного пользователя, обнаружил он его или нет?

Например, 3 навыка (ходить, разговаривать, писать).3 пользователя (Джон, Мэри, Джек).

Если Мэри ходит и пишет, как я могу получить ее в результате, например:

Mary => {Skill: walk(includes UserSkill), Skill : talk, Skill : write(includes UserSkill) }

Вы поняли:)

Ответы [ 3 ]

1 голос
/ 26 марта 2011

Попробуйте это:

class User

  def skill_list
    Skill.all(
      :select =>"skills.*, A.user_id AS user_id",
      :joins => "LEFT OUTER JOIN user_skills A 
                 ON A.skill_id = skills.id 
                  AND A.user_id = #{id}").map do |skill|
      skill.name + (skill.user_id.nil? ? "" : "(*)")
    end
  end

end

Теперь

user = User.find_by_name("Mary")
user.skill_list

Напечатает:

[
  walk(*),
  talk,
  write(*)
]
1 голос
/ 26 марта 2011

Я предполагаю, что вы хотите настроить что-то вроде этого:

class User < ActiveRecord::Base
  has_many :user_skills
  has_many :skills, :through => :user_skills
end

class Skill < ActiveRecord::Base
  has_many :user_skills
  has_many :users, :through => :user_skills
end

class UserSkill < ActiveRecord::Base
  belongs_to :user
  belongs_to :skill
end

, тогда вы можете сделать:

my_user.skills # returns all Skill records assigned to the user
my_user.user_skills.includes(:skill) # this allows you to access :level in addition to Skill attributes

Таким образом, способ получить и навыки, и user_skills - этоиспользуйте ассоциацию: user_skills.Основные has_many: через.Я что-то упустил?

0 голосов
/ 26 марта 2011
user = User.first
user.user_skills.all.map(&:skills)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...