我正在创建一个包含用户和类的rails应用程序。这些课程是由教师,科目和时期组成的三向联接表。我在教室和用户之间建立了多对多的关系,这样教室可以拥有许多用户,用户可以拥有许多教室。
除了rails应用程序之外,我还创建了一个API,以便我的应用程序可以与iPhone应用程序进行交互。当我创建一个有几个教室的用户时,我的问题出现了。在轨道方面一切正常,因为对于每个教室,我可以通过classroom.subject(或相应的键)获得主题,教师或句点。当我使用API创建用户时,我正在尝试回应用户教室。
如果我只是@user.to_json(:include => :classrooms)
,它会回复一个教室对象,该对象只包含教师,科目和期间的ID。由于没有教室教师的能力,这是没有用的。我将如何回应课堂,包括主题,教师和期间对象?这样在IOS方面,我可以为类对象创建一个字典,并且只需与它进行交互,而无需为获取教师,主题和句点的值进行请求。
以下是我在创建用户时的回应:
format.json { render json: @user.to_json(:include => :classrooms) }
以下是教室的创建方式:
@classroom = Classroom.where(:teacher_id => @new_teacher.id,
:period_id => @new_period.id,
:subject_id => @new_subject.id).first_or_create
考虑到Threeve的回答并在我的回复中包含render :json => @user.to_json(:include => {:classrooms => [:teacher, :period, :subject]})
后,我收到以下错误:
TypeError (no implicit conversion of Symbol into Integer):
app/controllers/api/v1/user_controller.rb:103:in `block (2 levels) in create'
app/controllers/api/v1/user_controller.rb:102:in `create'
答案 0 :(得分:0)
您是否尝试将更深层次的关联链接到#to_json
:include
选项?
当你做这样的事情时会是什么样子?
format.json {
render :json => @user.to_json(:include => {:classrooms => {:include => [:teacher, :period, :subject]}})
}
这应该可以为您提供教师/期间/科目关联的完整记录。
如果您想要明确显示或忽略哪些关联属性,请通过添加:only
和:except
选项让选项更加难看:
format.json {
render :json => resource.to_json(:include => { classrooms: {
:include => {
:teacher => {:only => [:first_name, :last_name]},
:period => {:except => :time},
:subject => {:only => :name}
}
}})
}
其他选项包括创建哈希然后将其转换为JSON,使用普通ERB呈现为JSON部分,或者使用RABL或JBuilder。