# == 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"
ジャックには2冊の書籍があり、トムには1冊の本があります。activerecordのhas_many定義でprimary_valueの値を取得するにはどうすればよいですか?
だからジャックはトムの本を借りた。今、ジャックには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
にhas_manyのように行うことができますすべての書籍を取得するには:all_books、CLASS_NAME:ブック、FOREIGN_KEYを::これが戻りますOWNER_ID tableのすべての列とprimary_keyが含まれているので、current_user.all_booksはすべてを返します – chaitanya