Ruby on Rails - 双关联数据库

时间:2014-09-20 21:23:27

标签: ruby-on-rails ruby database associations

我遇到这种情况:

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

由于

3 个答案:

答案 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