我有两个模型,Tweets和TweetsLocations,彼此相关联:
class Tweets < ActiveRecord::Base
has_one :location, :primary_key => "twitter_message_id",
:foreign_key => "twitter_message_id"
和
class TweetsLocation < ActiveRecord::Base
belongs_to :tweet
如果我加载推文,例如@tweet = Tweet.find(1)
,我可以看到它的所有属性没有问题。如果我想查看关联的位置属性,我可以使用@tweet.location
,再次没问题。
但是如果我想拥有一个包含来自Locations的相关属性的所有@tweet的JSON数组 - 这可能是优雅的,或者我是否需要使用推文创建一个新的“tweets_with_locations”数组内置于我的Locations模型的属性?
答案 0 :(得分:1)
如果您只想在JSON输出中包含TweetsLocation对象,可以使用:include
as_json
选项,例如:
@tweet = Tweet.find 1
@tweet.as_json :include => :location
但是,如果你想要包含TweetsLocation的属性,就好像它们是Tweet本身的属性一样,它有点复杂,但你有几个选择:
首先,您可以将所需的属性委托给TweetsLocation,例如:
class Tweets < ActiveRecord::Base
has_one :location, :primary_key => "twitter_message_id",
:foreign_key => "twitter_message_id"
# if TweetsLocation has e.g. "name" and "coordinates" attributes
delegate :coordinates, :name, :to => :location, :prefix => true
end
这种方式@tweet.as_json
的输出将包含location_name
和location_coordinates
个键。
其次,您可以覆盖as_json
以任何方式按摩JSON输出,例如:
class Tweets < ActiveRecord::Base
# ...
def as_json options = {}
# just merge all of TweetsLocation's attributes into the output
attributes.merge(location.attributes).to_json options
end
end