我有三张桌子;Area
,Movie
和MovieArea
. 在 Rails 中,我希望能够MovieArea
基于area_id
. Movie
然后,我想使用来自的字段返回一个复合 json 对象Movie
,并将同名的字段替换为来自MovieArea
.
我有以下数据库结构:
以及以下型号:
class Movie < ActiveRecord::Base
attr_accessible :title, :synopsis, :grossing, :director, :year, :facts
has_many :movie_areas, :class_name => 'MovieArea'
end
class Area < ActiveRecord::Base
attr_accessible :name
has_many :movie_areas, :class_name => 'MovieArea'
end
class MovieArea < ActiveRecord::Base
attr_accessible :movie_id, :area_id, :synopsis, :facts
belongs_to :area, :class_name => 'Area', :foreign_key => :area_id
belongs_to :movie, :class_name => 'Movie', :foreign_key => :movie_id
end
最后,我一直在尝试通过使用模型方法和更改 JSON 响应来创建这个对象。向模型添加:
def grossing
self.movie.grossing
end
def year
self.movie.year
end
def title
self.movie.title
end
等等。在控制器中:
@results = MovieArea.where(:area_id => @area.id)
最后,在视图中:
<%= @results.to_json(:methods => [:grossing, :year, :title] ).html_safe -%>
这很好,我得到了我想要的 JSON 对象的类型:
[
{
"id":1,
"area_id":1,
"movie_id":1,
"synopsis":"Area relevant movie synopsis",
"facts":"Area relevant movie facts",
"grossing":"$9001M",
"year":"1999",
"title":"Movie title",
},
.....
]
所以问题是:有没有更好的方法来做到这一点?例如,我可以从模型中输出它并调用类似的东西MovieArea.where(:area_id => @area.id).some_function_to_respond
吗?或者我可以将逻辑移动到控制器,以便在它简单调用的视图中@results.to_json()
?
谢谢!