我遇到这种情况:
user.rb
has_many :games
item.rb
has_many :games
game.rb
belongs_to :user, :foreign_key => 'user_id'
belongs_to :item, :foreign_key => 'item_id'
Item :
id : 13 | name : "Foo"
User :
id : 1 | name : "Me"
Game :
id : 1 | user_id : 4 | item_id : 13
id : 2 | user_id : 1 | item_id : 13
id : 3 | user_id : 2 | item_id : 2
id : 4 | user_id : 1 | item_id : 13
....
这有效:
item=Item.find(13)
user=User.find(1)
user.games (returns all games with the user_id == 1)
item.games (return all games with item_id == 13)
但是现在我想要用户1和项目13的所有游戏,我该怎么办?这不起作用:
user.item.games
由于
答案 0 :(得分:1)
这个怎么样?
Game.where(user_id: 1, item_id:13)
答案 1 :(得分:0)
请发布您在每个模型中使用的关联,这将有助于我们回答您的问题。
您是否尝试在您的user.rb(用户模型)中添加关联:
has_many :games
has_many :items, through: :games
然后你会得到用户喜欢的所有游戏的所有项目:
user.items
或对于您正在寻找的特定搜索,您可以在游戏模型中添加范围, game.rb :
scope :with_user, -> (user_id) { where(user_id: user_id) }
scope :with_item, -> (item_id) { where(item_id: item_id) }
然后你可以用:
写一个特定的搜索Game.with_user(1).with_item(13)
我没有测试任何这些,你必须根据自己的需要看看哪些适合你。
我会在this link了解有关范围的更多信息。
祝你好运!答案 2 :(得分:0)
因为游戏同时具有user_id和item_id,我相信用户和项目之间也应该存在关系。正如@Myst上面指出的那样,在这种情况下,has_many-through关系是理想的。那是: 在用户模型中:
has_many :games
has_many :items, through: :games
在您的游戏模型中:
belongs_to :user
belongs_to :item
在您的模型中实现它,然后您可以尝试
user.games.where(:item_id => 13)
如果您还想要这样的话:
item.users.where(:user_id => 1)
然后在你的项目模型中实现类似的关系,即:
has_many :games
has_many :users, through: :games