ActiveRecord-запрос, объединения (Rails 3.1) - PullRequest
1 голос
/ 12 октября 2011

Как мне получить объект JSON с

[
  {
    Property.field_1,
    Property.field_n,
    PropAssignmConsumer.field_1,
    PropAssignmConsumer.field_n
  },
  {
    Property.field_1,
    Property.field_n,
    PropAssignmConsumer.field_1,
    PropAssignmConsumer.field_n
  },
  ...,
  {
    Property.field_1,
    Property.field_n,
    PropAssignmConsumer.field_1,
    PropAssignmConsumer.field_n
  }
]

, отсортированным по некоторому ключу (может быть полем либо в Property, либо в PropAssignmConsumer) для данного объекта user_entity?т.е. получить все свойства, связанные с заданным потребителем / user_entity, извлекая поля из обоих свойств и prop_assignm_consumers, сортируя по полю в таблице свойств или в таблице prop_assignm_consumer.

Это мои модели:

class Property < ActiveRecord::Base
  has_many    :prop_assignm_consumers,  :dependent => :restrict
end

class PropAssignmConsumer < ActiveRecord::Base
  belongs_to  :consumer
  belongs_to  :property
end

class Consumer < UserEntity
  has_many        :prop_assignm_consumers,    :dependent => :destroy
  has_many        :properties,                :through   => :prop_assignm_consumers
end

Я сейчас делаю

properties = user_entity.properties.find(:all, :order => "#{sort_key} #{sort_ord}")
properties.each do |p|
  a = p.prop_assignm_consumers.find_by_consumer_id(current_user.user_entity.id)
  ... do something with a and p....
end

, но это кажется неэффективным ....

Любая помощь будет признательна.

1 Ответ

0 голосов
/ 26 октября 2011

Может быть, я что-то упустил. Почему ваша собственность также не ссылается на потребителей? У вас есть много ко многим, вы просто не завершили это. Просто добавив has_many :consumers, :through => :prop_assignm_consumer, вы сможете сделать

properties = user_entity_properties.all(:include => :consumers)
properties.each do |p| 
  p.consumers.where(:id => current_user.user_entity.id)
end 

Хотя теперь, когда мы это пишем, и учитывая, что вы делаете find_by, а не find_all_by, становится совершенно ясно, что будет только 1. Так что вы можете пойти другим путем.

consumer = Consumer.where(:id => current_user.user_entity.id).includes(:properties).first
consumer.properties.each do |p| 
  ... do something with p and consumer
end 

исх http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...