Связанные таблицы Rails не работают или has_many - PullRequest
2 голосов
/ 28 сентября 2011

У меня есть три таблицы: Пользователь, Типы пользователя и Покупки.

  • Пользователь: Идентификатор и т. Д.

  • user_purchase_types : id, typename, user_id

  • покупок: id, user_id, user_purchase_type_id, примечание

пользователейможет иметь любое количество покупок и user_types.Покупка может иметь один user_purchase_type.

Пользователи могут входить в систему, создавать типы, делать покупки и т. Д. - все это прекрасно работает

Однако я хочу, чтобы при перечислении покупок видеть user_purchase_types.typename,а не идентификационный номер.Я думаю, все просто, если он принадлежит, у них уже есть нужные поля идентификаторов, они должны просто работать.Но это не так

Я пробовал миллион вариаций принадлежащих ему: has_many, has_many и т. Д. И т. Д., Но не могу получить правильные отношения и поэтому показываю имя типа, а не id.

В таблицах указаны правильные поля идентификатора Foreign_key, поэтому это должно работать.

При перечислении покупок в контроллере покупок я использую @purchase = current_user.purchases.Зацикливая это для отображения в представлении, я думаю, что я должен быть в состоянии использовать purchase.user_purchase_type.typename, но это дает мне 'NoMethodError'.

Что я делаю неправильно, или я должен просто денормализовать БД и иметьс этим покончено?

РЕДАКТИРОВАТЬ Модели как req

class UserPurchaseType < ActiveRecord::Base
  belongs_to :user
  belongs_to :purchase
  attr_accessible :typename, :id
end

class User < ActiveRecord::Base
   devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  has_many :purchases, :dependent => :destroy
  has_many :user_purchase_types, :dependent => :destroy
end

class Purchase < ActiveRecord::Base
   belongs_to :user
  has_many :user_purchase_types
  attr_accessible :date, :user_purchase_type_id, :note 
end

файл index.erb

<% @purchases.each do |purchase| %>    #this works
  <tr>  
   <td><%= purchase.user_purchase_type.typename %></td>  #this fails
    <td><%= purchase.date %></td>
    <td><%= purchase.note %></td>
   </tr><p>
<% end %>

контроллер покупки

def index
  @user_purchase_types = current_user.user_purchase_types           # this works
  @purchases = current_user.purchases              #this works

Ответы [ 3 ]

1 голос
/ 28 сентября 2011
class Purchase < ActiveRecord::Base
   belongs_to :user
   has_many :user_purchase_types
   attr_accessible :date, :user_purchase_type_id, :note 
end

Ассоциация Purchase -> UserPurchaseType представляет собой отношение has_many, но вы, кажется, пытаетесь использовать его с user_purchase_type_id, что указывало бы на отношение belongs_to :user_purchase_type, но ваша ассоциация has_many :user_purchase_types

Звучит так, как будто вы хотите что-то вроде:

<% @purchases.each do |purchase| %>    #this works
  <tr>  
   <td><%= purchase.user_purchase_types.collect(&:typename).join(',') %></td>
    <td><%= purchase.date %></td>
    <td><%= purchase.note %></td>
   </tr><p>
<% end %>

, чтобы перечислить все ваши UserPurchaseType typename, разделенные запятой.

Если вы это сделаетеубедитесь, что при загрузке @purchases в контроллер также включен .includes(:user_purchase_types).Это позволит загрузить ассоциацию и избежать загрузки рельсов каждый UserPurchaseType при выполнении итерации.

1 голос
/ 28 сентября 2011

Вам просто нужно добавить внешний ключ в существующую ассоциацию.

class Purchase < ActiveRecord::Base
  belongs_to :user
  has_many :user_purchase_types, :foreign_key => 'user_purchase_type_id'
  attr_accessible :date, :user_purchase_type_id, :note 
end
1 голос
/ 28 сентября 2011

есть отношения один к одному между ними?да, вы должны иметь возможность доступа к typename, но используя @ purchase.user_type.typename.а не purchase.user_type.typename.

, и было бы лучше, если бы вы могли показывать и пользовательские модели.

и определяется ли current_user?

, также вы можете попробовать выяснить,сначала пользовательский тип, а затем доступ к нему: @user_type = UserType.find (@ purchase.user_type_id) @ user_type.typename

Вы всегда должны сначала попробовать отношения на консоли и посмотреть, получите ли вы их rgt


Все ваши отношения испорчены.У вас есть отношения один ко многим между покупками и типом покупок пользователя.и, следовательно, вы не можете использовать @ purchase.user_purchase_type.typename. Вы должны использовать

 @purchase.user_purchase_types.each do |i|
i.typename
end
...