Получение значения из связанной модели - PullRequest
2 голосов
/ 22 января 2011

Моя настройка: Rails 2.3.10, Ruby 1.8.7

Вот мои модели

class User
 has_many :user_projects
end

class Project
 has_many :user_projects
 #has a column named "project_type"
end

class UserProject
 belongs_to :user
 belongs_to :project
 #fields: project_id, user_id
end

Когда я возвращаю строку JSON пользователя и связанных с ним записей user_projects, я также хочу включить в запись user_project столбец project.project_type. Примечание: я не хочу также включать в результаты всю запись проекта. Возможным решением является дублирование поля project_type в user_projects, но я предпочитаю этого не делать, если это возможно, есть ли другой способ сделать это во время действия поиска / чтения?

Просто чтобы прояснить, вот выход JSON, который я ищу

{
  "user": {
    "username": "bob",
    "id": 1,
    "email": "bob@blah.com"
    "user_projects": [
      {
            "id": 15,
            "user_id": 1,
            "project_id": 10,
            "project_type": "marketing"
      }
      {
            "id": 22,
            "user_id": 1,
            "project_id": 11,
            "project_type": "sales"
      }
     ]
}

Ответы [ 2 ]

2 голосов
/ 22 января 2011
class UserProject
   belongs_to :user
   belongs_to :project
   #fields: project_id, user_id
   attr_reader :type


  def type
    self.project.type
  end
 end

 class MyController < AC

   def action
     @model = whatever
     respond_to do |format|
       format.json { render :json => @model.to_json(:methods => :type)}
     end

   end
 end

Надеюсь, это поможет.

2 голосов
/ 22 января 2011

Вы можете попробовать использовать ключ :only во вложенном включении:

user.to_json(:include => {:user_projects => {:include => {:project => {:only => :type}}}})

Но я бы добавил has_many :projects, :through => :user_projects к пользователю, чтобы вы могли сделать проще:

user.to_json(:include => {:projects => {:only => [:id, :type]}})

Кроме того, неуместное предостережение: никогда не используйте «тип» в качестве имени столбца в Rails, если вы не используете STI (т. Е. Типы проектов являются подклассами ruby ​​Project).

-

Редактировать

Вот способ добавить project_type в UserProject, как вы хотите

class UserProject
  belongs_to :user
  belongs_to :project
  delegate :type, :to => :project, :prefix => true
end

user.to_json(:include => {:user_projects => {:methods => :project_type}})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...