# == Schema Information
#
# Table name: books
# id :integer
# owner_id :integer
# Table name: users
# id :integer
# name :string
# Table name: shared_books_records
# user_id :integer
# book_id :integer
books
id: 1, owner_id: 1 # jack
id: 2, owner_id: 2 # tom
id: 3, owner_id: 1 # jack
users
id: 1, name: "jack"
id: 2, name: "tom"
杰克有两本书,汤姆有一本书。
shared_books_records
user_id: 1, book_id: 2
所以杰克借了汤姆的书。现在杰克应该有3本书。
class User
def all_books
join_sql = <<-SQL.squish!
LEFT OUTER JOIN shared_books_records
ON shared_books_records.user_id = books.assignee_id
SQL
condition = <<-SQL.squish!
books.owner_id = :user_id OR
shared_books_records.user_id = user_id
SQL
Book.joins(join_sql).where(condition, user_id: id)
end
end
我认为这不是很好,activerecord
关联更好。所以我想重新定义它。
has_many :all_books,
-> {
primary_key_value = xxxx # I want to get this value
join_sql = <<-SQL.squish!
LEFT OUTER JOIN shared_books_records
ON shared_books_records.user_id = books.assignee_id
SQL
condition = <<-SQL.squish!
books.owner_id = :user_id OR
shared_books_records.user_id = user_id
SQL
joins(join_sql).unscope(:where).where(condition, user_id: primary_key_value)
},
class_name: Book, foreign_key: :owner_id
但我不知道如何在范围内获得primary_key
的价值。
我的解决方案
has_many :all_books,
-> (user) {
primary_key_value = user.id # I want to get this value
join_sql = <<-SQL.squish!
LEFT OUTER JOIN shared_books_records
ON shared_books_records.user_id = books.assignee_id
SQL
condition = <<-SQL.squish!
books.owner_id = :user_id OR
shared_books_records.user_id = :user_id
SQL
joins(join_sql).unscope(:where).where(condition, user_id: primary_key_value)
},
class_name: Book, foreign_key: :owner_id
答案 0 :(得分:0)
要获得所有书籍,您可以像这样做
class User
has_many :user_books
has_many :books, through: :user_books
end
class UserBook
belongs_to :books
belongs_to :users
end
class Book
has_many :user_books
has_many :users, through: :user_books
end
# Table name: books
# id :integer
# owner_id :integer
# Table name: users
# id :integer
# Table name: user_books (previously shared_books_record)
# user_id :integer
# book_id :integer
def all_ books
#lets say id has value for user_id
user = User.find(id)
all_books = user.books #this should return an array of all books which belongs to the current user
end
答案 1 :(得分:0)
class User
has_many :user_books
has_many :books, through: :user_books
end
class UserBook
belongs_to :books
belongs_to :users
end
class Book
has_many :user_books
has_many :users, through: :user_books
end