Объединить связанные данные модели через внешний ключ с моделью в RoR - PullRequest
0 голосов
/ 16 января 2012

У меня есть две модели, 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), яможно увидеть все атрибуты без проблем.Если я хочу увидеть связанные атрибуты Location, я могу с @tweet.location, опять же, без проблем.

Но если я хотел иметь массив JSON всех @tweet (s), который включал связанные атрибуты из Locations - это возможно элегантно, или мне нужно создать новый массив "tweets_with_locations" ствиты и атрибуты из моей модели Locations, встроенные в нее?

1 Ответ

1 голос
/ 16 января 2012

Если вы просто хотите включить объект TweetsLocation в свой вывод JSON, вы можете использовать опцию :include для as_json, например:

@tweet = Tweet.find 1
@tweet.as_json :include => :location

Если, однако, вы хотите включить TweetsLocationатрибуты, как если бы они были атрибутами самого твита, это немного сложнее, но у вас есть несколько вариантов:

Во-первых, вы можете делегировать нужные атрибуты в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...