通过不同的名称将相同的模型关联两次

时间:2013-10-07 07:37:44

标签: postgresql associations ruby-on-rails-4

我正在尝试实现丢失并找到的数据库。 我有两个模型UserItem。用户可以丢失项目并找到项目。并且项目可以包含找到它的用户和丢失它的用户。我希望能够通过不同的名称引用相同的模型,例如

user.found_items, user.lost_items, item.founder, item.losser

现在我能够做到:

user.foundsuser.lostsuser.items将从遗失中返回items

class User < ActiveRecord::Base
  has_many :founds
  has_many :items, through: :founds

  has_many :losts
  has_many :items, through: :losts
end

class Lost < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

class Found < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_one :found
  has_one :user, through: :found

  has_one :lost
  has_one :user, through: :lost
end

1 个答案:

答案 0 :(得分:0)

我会做一些非常相似的事情,只是为了清晰起见重命名,并为你想要的功能添加一些方法。

class User < ActiveRecord::Base

  has_many :found_items
  has_many :items, through: :found_item

  has_many :lost_items
  has_many :items, through: :lost_item

  def items_found
    self.found_items.map {|i| i.item.name }
  end

  def items_lost
    self.lost_items.map {|i| i.item.name }
  end

end

class LostItem < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

class FoundItem < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_one :found_item
  has_one :user, through: :found_item

  has_one :lost_item
  has_one :user, through: :lost_item

  def finder
    self.found_item.user.name
  end

  def loser
    self.lost_item.user.name
  end
end