我有两个模型,一个用户和一个消息。
消息 有许多 收件人。
用户 收到了许多 消息。
因此,消息 拥有并属于许多 收件人。
和
消息 有一个 创建者。
用户 创建了许多 消息。
我认为我的结构正确,但是我遇到了一些问题,所以我想确保我做对了。
迁移:
def self.up
create_table :users_messages, :id => false do |t|
t.integer :message_id
t.integer :user_id
end
add_index :users_messages, [:user_id, :message_id]
end
和
def change
add_column :messages, :creator_id, :integer
end
User.rb:
has_and_belongs_to_many :messages
belongs_to :message, foreign_key: "creator_id"
Message.rb:
belongs_to :creator, :class_name => "User"
has_and_belongs_to_many :users
但是当我运行这个查询时:
Message.where("users.id = 1")
我明白了:
Unknown column 'users.id'
我错过了什么?
答案 0 :(得分:1)
您已在消息表中添加了creator_id
列,因此belongs_to
声明应位于消息模型中。
在用户模型中,您应该有has_one :message
属于的人是具有ID
的人更多详情here
关于消息查询,如果在Message类中创建范围,如:
named_scope: :with_user, lambda{ |user|
joins(:users).
where("messages_users.user_id = ?", user.id)
}
# EDIT: You could even use the association name as joins parameter and Rails will take care of the rest.
您只需拨打Message.with_user(some_user)
,然后继续链接其他示波器。
答案 1 :(得分:1)
好的,你有几个问题:
user.messages
,而不是Message.where("users.id = 1")
的操作。 Rails将为您处理SQL。messages_users
,而不是users_messages
。表名应该是按字母顺序连接表的名称。User.rb
中,belongs_to :message, foreign_key: "creator_id"
应为has_many :created_messages, foreign_key: "creator_id"
,因为用户可以(我假设)创建了许多消息。 belongs_to
始终用于具有外键的模型。关系的另一面将是has_one
或has_many
。答案 2 :(得分:0)
这个video帮助了我这个概念
在Rails中设置多对多关联有两种不同的方法。在本集中,您将了解如何实现这两种方式以及为项目选择正确方法的一些提示。