2011-01-21 5 views
2

Мои настройки: 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, но я предпочитаю не делать этого, если это возможно, есть ли другой способ выполнить это во время действия find/read?

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

{ 
    "user": { 
    "username": "bob", 
    "id": 1, 
    "email": "[email protected]" 
    "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

Вы можете попробовать использовать :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]}}) 

Кроме того, не по теме cau Примечание: никогда не используйте «type» в качестве имени столбца в Rails, если вы не используете STI (т.е. типы проектов - это рубиновые подклассы проекта).

-

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

Вот способ добавить 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}}) 
+0

Хорошая точка, не использующая «тип» в качестве столбца, я на самом деле не делаю этого, плохой пример с моей стороны. Я предпочитаю только возвращать столбцы user_projects.user_id, project_id и project.type в контексте внутри области user_project, есть ли способ сделать это? Я думал, что смогу использовать attr_accessor и каким-то образом вытащить значение из проекта, когда будет выполняться запись user_project, но не может заставить это работать. – Bob

+0

смотри мой ответ, похоже, это то, чего ты хочешь достичь – Pasta

2
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 

Надеются, что это помогает.

+0

Спасибо, это ближе к тому, что я думал делать, за исключением того, что мне нужно вернуть все данные пользователя и включить user_projects плюс столбец типа как часть деталей user_project, любой идея синтаксиса? – Bob

+0

Ничего, я понял, что работал точно так, как я надеялся, спасибо! – Bob

+0

Последнее замечание, это должно быть def self.type – Bob

Смежные вопросы