通过外键将关联的模型数据与RoR中的模型相结合

时间:2012-01-15 23:21:14

标签: ruby-on-rails activerecord

我有两个模型,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模型的属性?

1 个答案:

答案 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_namelocation_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