0

我有UserItem模型。用户可能likewantown物品。我如何在 Rails 中创建这种关系?这三个动作将来可能会增加,所以我想让它变得灵活。

对不起我的英语不好

更新

我创建了名为UserActionandUserActionType

user.rb我添加

has_many :user_actions
has_many :actions, :through => :user_actions, :source => :user_action

def method_missing(method_id, *arguments)
    if match = /([_a-zA-Z]\w*)_it/.match(method_id.to_s)
      action_name = match[1]
      action_type = UserActionType.find_by_name(action_name)
      action = action_type.user_actions.new
      action.user = self
      action.item = arguments[0]

      action_type.save
      action.save

    elsif match = /find_my_([_a-zA-Z]\w*)s/.match(method_id.to_s)
      action_name = match[1]
      user_actions.joins('LEFT JOIN user_action_types ON user_action_types.id = user_actions.user_action_type_id').where('user_action_types.name = "'+ action_name +'"')
    else
      super
    end
  end

这样,我就有了own_it, want_it, like_itandfind_my_likes等方法find_my_*

你觉得我的解决方案怎么样?

4

2 回答 2

1

我认为最好使用through-association

因此,您将在 User 和 Item 模型之间建立一个模型,例如 user_item ,您可以在其中存储类型(例如,想要或拥有)。

我认为您不需要另一个模型来控制类型(例如,想要或拥有),看看这个宝石Ambry。有了它,您可以创建一个“虚拟数据库”。

祝你好运!

于 2013-05-03T17:08:37.497 回答
0

一个解决方案是has_and_belongs_to_many对每个动作使用一个。要在and之间创建多个has_and_belongs_to_many关系,您必须使用选项:UserItemclass_name

class User < ActiveRecord::Base

  has_and_belongs_to_many :liked_items, :class_name => 'Item'
  has_and_belongs_to_many :wanted_items, :class_name => 'Item'
  has_and_belongs_to_many :owned_items, :class_name => 'Item'

  #...
end
于 2013-05-03T17:07:11.730 回答